@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); final float minAngle = (float) Math.PI / 8; final float maxAngle = (float) Math.PI * 7 / 8; float angle = minAngle; if (mRecorder != null) angle += (float) (maxAngle - minAngle) * mRecorder.getMaxAmplitude() / 32768; if (angle > mCurrentAngle) mCurrentAngle = angle; else mCurrentAngle = Math.max(angle, mCurrentAngle - DROPOFF_STEP); mCurrentAngle = Math.min(maxAngle, mCurrentAngle); float w = getWidth(); float h = getHeight(); float pivotX = w / 2; float pivotY = h - PIVOT_RADIUS - PIVOT_Y_OFFSET; float l = h * 4 / 5; float sin = (float) Math.sin(mCurrentAngle); float cos = (float) Math.cos(mCurrentAngle); float x0 = pivotX - l * cos; float y0 = pivotY - l * sin; canvas.drawLine( x0 + SHADOW_OFFSET, y0 + SHADOW_OFFSET, pivotX + SHADOW_OFFSET, pivotY + SHADOW_OFFSET, mShadow); canvas.drawCircle(pivotX + SHADOW_OFFSET, pivotY + SHADOW_OFFSET, PIVOT_RADIUS, mShadow); canvas.drawLine(x0, y0, pivotX, pivotY, mPaint); canvas.drawCircle(pivotX, pivotY, PIVOT_RADIUS, mPaint); if (mRecorder != null && mRecorder.state() == Recorder.RECORDING_STATE) postInvalidateDelayed(ANIMATION_INTERVAL); }