| package org.wordpress.android.editor; |
| |
| import android.content.Context; |
| import android.graphics.Canvas; |
| import android.graphics.Paint; |
| import android.support.annotation.NonNull; |
| import android.util.AttributeSet; |
| import android.view.MotionEvent; |
| import android.widget.ToggleButton; |
| |
| public class RippleToggleButton extends ToggleButton { |
| private static final int FRAME_RATE = 10; |
| private static final int DURATION = 250; |
| private static final int FILL_INITIAL_OPACITY = 200; |
| private static final int STROKE_INITIAL_OPACITY = 255; |
| |
| private float mHalfWidth; |
| private boolean mAnimationIsRunning = false; |
| private int mTimer = 0; |
| private Paint mFillPaint; |
| private Paint mStrokePaint; |
| |
| public RippleToggleButton(Context context) { |
| this(context, null); |
| } |
| |
| public RippleToggleButton(Context context, AttributeSet attrs) { |
| this(context, attrs, 0); |
| } |
| |
| public RippleToggleButton(Context context, AttributeSet attrs, int defStyle) { |
| super(context, attrs, defStyle); |
| init(); |
| } |
| |
| private void init() { |
| if (isInEditMode()) { |
| return; |
| } |
| |
| int rippleColor = getResources().getColor(R.color.format_bar_ripple_animation); |
| |
| mFillPaint = new Paint(); |
| mFillPaint.setAntiAlias(true); |
| mFillPaint.setColor(rippleColor); |
| mFillPaint.setStyle(Paint.Style.FILL); |
| mFillPaint.setAlpha(FILL_INITIAL_OPACITY); |
| |
| mStrokePaint = new Paint(); |
| mStrokePaint.setAntiAlias(true); |
| mStrokePaint.setColor(rippleColor); |
| mStrokePaint.setStyle(Paint.Style.STROKE); |
| mStrokePaint.setStrokeWidth(2); |
| mStrokePaint.setAlpha(STROKE_INITIAL_OPACITY); |
| |
| setWillNotDraw(false); |
| } |
| |
| @Override |
| public void draw(@NonNull Canvas canvas) { |
| super.draw(canvas); |
| if (mAnimationIsRunning) { |
| if (DURATION <= mTimer * FRAME_RATE) { |
| mAnimationIsRunning = false; |
| mTimer = 0; |
| } else { |
| float progressFraction = ((float) mTimer * FRAME_RATE) / DURATION; |
| |
| mFillPaint.setAlpha((int) (FILL_INITIAL_OPACITY * (1 - progressFraction))); |
| mStrokePaint.setAlpha((int) (STROKE_INITIAL_OPACITY * (1 - progressFraction))); |
| |
| canvas.drawCircle(mHalfWidth, mHalfWidth, mHalfWidth * progressFraction, mFillPaint); |
| canvas.drawCircle(mHalfWidth, mHalfWidth, mHalfWidth * progressFraction, mStrokePaint); |
| |
| mTimer++; |
| } |
| |
| invalidate(); |
| } |
| } |
| |
| @Override |
| public boolean onTouchEvent(@NonNull MotionEvent event) { |
| startRippleAnimation(); |
| return super.onTouchEvent(event); |
| } |
| |
| private void startRippleAnimation() { |
| if (this.isEnabled() && !mAnimationIsRunning) { |
| mHalfWidth = getMeasuredWidth() / 2; |
| mAnimationIsRunning = true; |
| invalidate(); |
| } |
| } |
| } |