Intereting Posts
На Kindle Fire можно ли получить адрес электронной почты пользователя? Java.io.IOException: Ошибка при выполнении exec (). Команды: Рабочий каталог: null Окружающая среда: null RxJava и Retrofit2: NetworkOnMainThreadException Google подписывает подписанный apk не работает Как создать собственный интерфейс Listener в android? Фрагмент, реализующий AsyncTask и Listview в android Пустая страница отображается при повторном нажатии фрагмента и замене на тот же фрагмент Перехват кнопки «Назад» Android startActivity () сбой Как использовать WebView для отображения html-страниц в режиме чтения электронных книг? Обнаружение AC (включение / выключение) и Окно (открытие / закрытие) CAR с использованием OBD Вставьте номер строки, начинающийся с нуля, в столбец строк, используя ContentValues, но ведущий ноль всегда удаляется Не удалось импортировать новый проект Gradle в андроид-студию Настройка панели поиска в Android Lambda вызывает исключение компилятора в модуле библиотеки Android

Создание формы звукового файла в android

Я хочу создать волновые формы аудиофайла в android. Может ли кто-нибудь предоставить мне пример исходного кода?

Создайте класс и увеличьте представление. Затем создайте интерфейс Listener для своего класса.

public class WaveformCls extends View { public interface WaveformListener { public void waveformTouchStart(float x); public void waveformTouchMove(float x); public void waveformTouchEnd(); public void waveformFling(float x); public void waveformDraw(); }; 

Создайте объект Paint в соответствии с вашим требованием.
Создайте один метод, который инициализирует весь объект Paint.

 public WaveformView(Context context, AttributeSet attrs) { super(context, attrs); // We don't want keys, the markers get these setFocusable(false); mGridPaint = new Paint(); mGridPaint.setAntiAlias(false); mGridPaint.setColor( getResources().getColor(R.drawable.grid_line)); mSelectedLinePaint = new Paint(); mSelectedLinePaint.setAntiAlias(false); mSelectedLinePaint.setColor( getResources().getColor(R.drawable.waveform_selected)); mUnselectedLinePaint = new Paint(); mUnselectedLinePaint.setAntiAlias(false); mUnselectedLinePaint.setColor( getResources().getColor(R.drawable.waveform_unselected)); mUnselectedBkgndLinePaint = new Paint(); mUnselectedBkgndLinePaint.setAntiAlias(false); mUnselectedBkgndLinePaint.setColor( getResources().getColor( R.drawable.waveform_unselected_bkgnd_overlay)); mBorderLinePaint = new Paint(); mBorderLinePaint.setAntiAlias(true); mBorderLinePaint.setStrokeWidth(1.5f); mBorderLinePaint.setPathEffect( new DashPathEffect(new float[] { 3.0f, 2.0f }, 0.0f)); mBorderLinePaint.setColor( getResources().getColor(R.drawable.selection_border)); mPlaybackLinePaint = new Paint(); mPlaybackLinePaint.setAntiAlias(false); mPlaybackLinePaint.setColor( getResources().getColor(R.drawable.playback_indicator)); mTimecodePaint = new Paint(); mTimecodePaint.setTextSize(12); mTimecodePaint.setAntiAlias(true); mTimecodePaint.setColor( getResources().getColor(R.drawable.timecode)); mTimecodePaint.setShadowLayer( 2, 1, 1, getResources().getColor(R.drawable.timecode_shadow)); mGestureDetector = new GestureDetector( context, new GestureDetector.SimpleOnGestureListener() { public boolean onFling( MotionEvent e1, MotionEvent e2, float vx, float vy) { mListener.waveformFling(vx); return true; } }); mSoundFile = null; mLenByZoomLevel = null; mValuesByZoomLevel = null; mHeightsAtThisZoomLevel = null; mOffset = 0; mPlaybackPos = -1; mSelectionStart = 0; mSelectionEnd = 0; mDensity = 1.0f; mInitialized = false; } 

Вам необходимо переопределить onTouchEvent

 @Override public boolean onTouchEvent(MotionEvent event) { if (mGestureDetector.onTouchEvent(event)) { return true; } switch(event.getAction()) { case MotionEvent.ACTION_DOWN: mListener.waveformTouchStart(event.getX()); break; case MotionEvent.ACTION_MOVE: mListener.waveformTouchMove(event.getX()); break; case MotionEvent.ACTION_UP: mListener.waveformTouchEnd(); break; } return true; } public void setSoundFile(CheapSoundFile soundFile) { mSoundFile = soundFile; mSampleRate = mSoundFile.getSampleRate(); mSamplesPerFrame = mSoundFile.getSamplesPerFrame(); computeDoublesForAllZoomLevels(); mHeightsAtThisZoomLevel = null; } 

Переопределите метод рисования, который рисует волну на экране.

 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mSoundFile == null) return; if (mHeightsAtThisZoomLevel == null) computeIntsForThisZoomLevel(); // Draw waveform int measuredWidth = getMeasuredWidth(); int measuredHeight = getMeasuredHeight(); int start = mOffset; int width = mHeightsAtThisZoomLevel.length - start; int ctr = measuredHeight / 2; if (width > measuredWidth) width = measuredWidth; // Draw grid double onePixelInSecs = pixelsToSeconds(1); boolean onlyEveryFiveSecs = (onePixelInSecs > 1.0 / 50.0); double fractionalSecs = mOffset * onePixelInSecs; int integerSecs = (int) fractionalSecs; int i = 0; while (i < width) { i++; fractionalSecs += onePixelInSecs; int integerSecsNew = (int) fractionalSecs; if (integerSecsNew != integerSecs) { integerSecs = integerSecsNew; if (!onlyEveryFiveSecs || 0 == (integerSecs % 5)) { canvas.drawLine(i, 0, i, measuredHeight, mGridPaint); } } } // Draw waveform for (i = 0; i < width; i++) { Paint paint; if (i + start >= mSelectionStart && i + start < mSelectionEnd) { paint = mSelectedLinePaint; } else { drawWaveformLine(canvas, i, 0, measuredHeight, mUnselectedBkgndLinePaint); paint = mUnselectedLinePaint; } drawWaveformLine( canvas, i, ctr - mHeightsAtThisZoomLevel[start + i], ctr + 1 + mHeightsAtThisZoomLevel[start + i], paint); if (i + start == mPlaybackPos) { canvas.drawLine(i, 0, i, measuredHeight, mPlaybackLinePaint); } } // If we can see the right edge of the waveform, draw the // non-waveform area to the right as unselected for (i = width; i < measuredWidth; i++) { drawWaveformLine(canvas, i, 0, measuredHeight, mUnselectedBkgndLinePaint); } // Draw borders canvas.drawLine( mSelectionStart - mOffset + 0.5f, 30, mSelectionStart - mOffset + 0.5f, measuredHeight, mBorderLinePaint); canvas.drawLine( mSelectionEnd - mOffset + 0.5f, 0, mSelectionEnd - mOffset + 0.5f, measuredHeight - 30, mBorderLinePaint); // Draw timecode double timecodeIntervalSecs = 1.0; if (timecodeIntervalSecs / onePixelInSecs < 50) { timecodeIntervalSecs = 5.0; } if (timecodeIntervalSecs / onePixelInSecs < 50) { timecodeIntervalSecs = 15.0; } // Draw grid fractionalSecs = mOffset * onePixelInSecs; int integerTimecode = (int) (fractionalSecs / timecodeIntervalSecs); i = 0; while (i < width) { i++; fractionalSecs += onePixelInSecs; integerSecs = (int) fractionalSecs; int integerTimecodeNew = (int) (fractionalSecs / timecodeIntervalSecs); if (integerTimecodeNew != integerTimecode) { integerTimecode = integerTimecodeNew; // Turn, eg 67 seconds into "1:07" String timecodeMinutes = "" + (integerSecs / 60); String timecodeSeconds = "" + (integerSecs % 60); if ((integerSecs % 60) < 10) { timecodeSeconds = "0" + timecodeSeconds; } String timecodeStr = timecodeMinutes + ":" + timecodeSeconds; float offset = (float) ( 0.5 * mTimecodePaint.measureText(timecodeStr)); canvas.drawText(timecodeStr, i - offset, (int)(12 * mDensity), mTimecodePaint); } } if (mListener != null) { mListener.waveformDraw(); } } 

Вот полный исходный код Rindroid, который вам полезен
Исходный код для формы волны