在android中创建音频文件的波形

前端之家收集整理的这篇文章主要介绍了在android中创建音频文件的波形前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在 android中创建音频文件的波形.任何人都可以提供示例源代码吗?

解决方法

创建类并扩展View.然后为您的类创建Listener接口.
  1. public class WaveformCls extends View {
  2. public interface WaveformListener {
  3. public void waveformTouchStart(float x);
  4. public void waveformTouchMove(float x);
  5. public void waveformTouchEnd();
  6. public void waveformFling(float x);
  7. public void waveformDraw();
  8. };

根据您的要求创建Paint对象.
创建一个初始化所有Paint对象的方法.

  1. public WaveformView(Context context,AttributeSet attrs) {
  2. super(context,attrs);
  3.  
  4. // We don't want keys,the markers get these
  5. setFocusable(false);
  6.  
  7. mGridPaint = new Paint();
  8. mGridPaint.setAntiAlias(false);
  9. mGridPaint.setColor(
  10. getResources().getColor(R.drawable.grid_line));
  11. mSelectedLinePaint = new Paint();
  12. mSelectedLinePaint.setAntiAlias(false);
  13. mSelectedLinePaint.setColor(
  14. getResources().getColor(R.drawable.waveform_selected));
  15. mUnselectedLinePaint = new Paint();
  16. mUnselectedLinePaint.setAntiAlias(false);
  17. mUnselectedLinePaint.setColor(
  18. getResources().getColor(R.drawable.waveform_unselected));
  19. mUnselectedBkgndLinePaint = new Paint();
  20. mUnselectedBkgndLinePaint.setAntiAlias(false);
  21. mUnselectedBkgndLinePaint.setColor(
  22. getResources().getColor(
  23. R.drawable.waveform_unselected_bkgnd_overlay));
  24. mBorderLinePaint = new Paint();
  25. mBorderLinePaint.setAntiAlias(true);
  26. mBorderLinePaint.setStrokeWidth(1.5f);
  27. mBorderLinePaint.setPathEffect(
  28. new DashPathEffect(new float[] { 3.0f,2.0f },0.0f));
  29. mBorderLinePaint.setColor(
  30. getResources().getColor(R.drawable.selection_border));
  31. mPlaybackLinePaint = new Paint();
  32. mPlaybackLinePaint.setAntiAlias(false);
  33. mPlaybackLinePaint.setColor(
  34. getResources().getColor(R.drawable.playback_indicator));
  35. mTimecodePaint = new Paint();
  36. mTimecodePaint.setTextSize(12);
  37. mTimecodePaint.setAntiAlias(true);
  38. mTimecodePaint.setColor(
  39. getResources().getColor(R.drawable.timecode));
  40. mTimecodePaint.setShadowLayer(
  41. 2,1,getResources().getColor(R.drawable.timecode_shadow));
  42.  
  43. mGestureDetector = new GestureDetector(
  44. context,new GestureDetector.SimpleOnGestureListener() {
  45. public boolean onFling(
  46. MotionEvent e1,MotionEvent e2,float vx,float vy) {
  47. mListener.waveformFling(vx);
  48. return true;
  49. }
  50. });
  51.  
  52. mSoundFile = null;
  53. mLenByZoomLevel = null;
  54. mValuesByZoomLevel = null;
  55. mHeightsAtThisZoomLevel = null;
  56. mOffset = 0;
  57. mPlaybackPos = -1;
  58. mSelectionStart = 0;
  59. mSelectionEnd = 0;
  60. mDensity = 1.0f;
  61. mInitialized = false;
  62. }

您需要覆盖onTouchEvent

  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. if (mGestureDetector.onTouchEvent(event)) {
  4. return true;
  5. }
  6.  
  7. switch(event.getAction()) {
  8. case MotionEvent.ACTION_DOWN:
  9. mListener.waveformTouchStart(event.getX());
  10. break;
  11. case MotionEvent.ACTION_MOVE:
  12. mListener.waveformTouchMove(event.getX());
  13. break;
  14. case MotionEvent.ACTION_UP:
  15. mListener.waveformTouchEnd();
  16. break;
  17. }
  18. return true;
  19. }
  20.  
  21. public void setSoundFile(CheapSoundFile soundFile) {
  22. mSoundFile = soundFile;
  23. mSampleRate = mSoundFile.getSampleRate();
  24. mSamplesPerFrame = mSoundFile.getSamplesPerFrame();
  25. computeDoublesForAllZoomLevels();
  26. mHeightsAtThisZoomLevel = null;
  27. }

覆盖在屏幕上绘制波形的绘制方法.

  1. @Override
  2. protected void onDraw(Canvas canvas) {
  3. super.onDraw(canvas);
  4. if (mSoundFile == null)
  5. return;
  6.  
  7. if (mHeightsAtThisZoomLevel == null)
  8. computeIntsForThisZoomLevel();
  9.  
  10. // Draw waveform
  11. int measuredWidth = getMeasuredWidth();
  12. int measuredHeight = getMeasuredHeight();
  13. int start = mOffset;
  14. int width = mHeightsAtThisZoomLevel.length - start;
  15. int ctr = measuredHeight / 2;
  16.  
  17. if (width > measuredWidth)
  18. width = measuredWidth;
  19.  
  20. // Draw grid
  21. double onePixelInSecs = pixelsToSeconds(1);
  22. boolean onlyEveryFiveSecs = (onePixelInSecs > 1.0 / 50.0);
  23. double fractionalSecs = mOffset * onePixelInSecs;
  24. int integerSecs = (int) fractionalSecs;
  25. int i = 0;
  26. while (i < width) {
  27. i++;
  28. fractionalSecs += onePixelInSecs;
  29. int integerSecsNew = (int) fractionalSecs;
  30. if (integerSecsNew != integerSecs) {
  31. integerSecs = integerSecsNew;
  32. if (!onlyEveryFiveSecs || 0 == (integerSecs % 5)) {
  33. canvas.drawLine(i,i,measuredHeight,mGridPaint);
  34. }
  35. }
  36. }
  37.  
  38. // Draw waveform
  39. for (i = 0; i < width; i++) {
  40. Paint paint;
  41. if (i + start >= mSelectionStart &&
  42. i + start < mSelectionEnd) {
  43. paint = mSelectedLinePaint;
  44. } else {
  45. drawWaveformLine(canvas,mUnselectedBkgndLinePaint);
  46. paint = mUnselectedLinePaint;
  47. }
  48. drawWaveformLine(
  49. canvas,ctr - mHeightsAtThisZoomLevel[start + i],ctr + 1 + mHeightsAtThisZoomLevel[start + i],paint);
  50.  
  51. if (i + start == mPlaybackPos) {
  52. canvas.drawLine(i,mPlaybackLinePaint);
  53. }
  54. }
  55.  
  56. // If we can see the right edge of the waveform,draw the
  57. // non-waveform area to the right as unselected
  58. for (i = width; i < measuredWidth; i++) {
  59. drawWaveformLine(canvas,mUnselectedBkgndLinePaint);
  60. }
  61.  
  62. // Draw borders
  63. canvas.drawLine(
  64. mSelectionStart - mOffset + 0.5f,30,mSelectionStart - mOffset + 0.5f,mBorderLinePaint);
  65. canvas.drawLine(
  66. mSelectionEnd - mOffset + 0.5f,mSelectionEnd - mOffset + 0.5f,measuredHeight - 30,mBorderLinePaint);
  67.  
  68. // Draw timecode
  69. double timecodeIntervalSecs = 1.0;
  70. if (timecodeIntervalSecs / onePixelInSecs < 50) {
  71. timecodeIntervalSecs = 5.0;
  72. }
  73. if (timecodeIntervalSecs / onePixelInSecs < 50) {
  74. timecodeIntervalSecs = 15.0;
  75. }
  76.  
  77. // Draw grid
  78. fractionalSecs = mOffset * onePixelInSecs;
  79. int integerTimecode = (int) (fractionalSecs / timecodeIntervalSecs);
  80. i = 0;
  81. while (i < width) {
  82. i++;
  83. fractionalSecs += onePixelInSecs;
  84. integerSecs = (int) fractionalSecs;
  85. int integerTimecodeNew = (int) (fractionalSecs /
  86. timecodeIntervalSecs);
  87. if (integerTimecodeNew != integerTimecode) {
  88. integerTimecode = integerTimecodeNew;
  89.  
  90. // Turn,e.g. 67 seconds into "1:07"
  91. String timecodeMinutes = "" + (integerSecs / 60);
  92. String timecodeSeconds = "" + (integerSecs % 60);
  93. if ((integerSecs % 60) < 10) {
  94. timecodeSeconds = "0" + timecodeSeconds;
  95. }
  96. String timecodeStr = timecodeMinutes + ":" + timecodeSeconds;
  97. float offset = (float) (
  98. 0.5 * mTimecodePaint.measureText(timecodeStr));
  99. canvas.drawText(timecodeStr,i - offset,(int)(12 * mDensity),mTimecodePaint);
  100. }
  101. }
  102.  
  103. if (mListener != null) {
  104. mListener.waveformDraw();
  105. }
  106. }

以下是Rindroid的完整源代码,对您有用
Source code for waveform

猜你在找的Android相关文章