blob: fd2ac6110142479af945f3db84f3cd7aa3387b1e [file] [log] [blame]
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();
}
}
}