@Override public boolean onTouchEvent(MotionEvent event) { 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; }
@Override public boolean onTouchEvent(MotionEvent event) { mScaleGestureDetector.onTouchEvent(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; } // Log.i(GlobParam.LOG_TAG, "Ha entrat en WaveformView en onTouchEvent"); return true; }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mSoundFile == null) return; int measuredWidth = getMeasuredWidth(); int measuredHeight = getMeasuredHeight(); int start = mOffset; int width = mLenByZoomLevel[mZoomLevel] - start; int ctr = measuredHeight / 2; if (width > measuredWidth) width = measuredWidth; double onePixelInSecs = pixelsToSeconds(1); boolean onlyEveryFiveSecs = (onePixelInSecs > 1.0 / 50.0); double fractionalSecs = mOffset * onePixelInSecs; int integerSecs = (int) fractionalSecs; double timecodeIntervalSecs = 1.0; int factor = 1; while (timecodeIntervalSecs / onePixelInSecs < 50) { timecodeIntervalSecs = 5.0 * factor; factor++; } int integerTimecode = (int) (fractionalSecs / timecodeIntervalSecs); int i = 0; while (i < width) { fractionalSecs += onePixelInSecs; int integerSecsNew = (int) fractionalSecs; if (integerSecsNew != integerSecs) { integerSecs = integerSecsNew; if (!onlyEveryFiveSecs || 0 == (integerSecs % 5)) { canvas.drawLine(i + 1, 0, i + 1, measuredHeight, mGridPaint); } } Paint paint = selectWaveformPaint(i, start); // Draw waveform drawWaveform(canvas, i, start, measuredHeight, ctr, paint); i++; } // 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 grid fractionalSecs = mOffset * onePixelInSecs; i = 0; while (i < width) { i++; fractionalSecs += onePixelInSecs; int integerSecs2 = (int) fractionalSecs; int integerTimecodeNew = (int) (fractionalSecs / timecodeIntervalSecs); if (integerTimecodeNew != integerTimecode) { integerTimecode = integerTimecodeNew; // Turn, e.g. 67 seconds into "1:07" String timecodeMinutes = "" + (integerSecs2 / 60); String timecodeSeconds = "" + (integerSecs2 % 60); if ((integerSecs2 % 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(); } }
@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, e.g. 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, 15, mTimecodePaint); } } if (mListener != null) { mListener.waveformDraw(); } }