package com.gospelware.liquidbutton.controller; import android.animation.Animator; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.view.animation.OvershootInterpolator; /** * Created by ricogao on 16/05/2016. */ public class TickController extends BaseController { private float[] ticksCoordinates = new float[]{0.29f, 0.525f, 0.445f, 0.675f, 0.74f, 0.45f}; private Path tickPath; private PointF tickPoint1, tickPoint2, tickPoint3, tickControl2, tickControl3; private static final float TICK_OVERSHOOT_TENSION = 2.0f; private static final long TICK_ANIMATION_DURATION = 800; private static final float SCALE_DOWN_SIZE = 0.8f; private final static String LIQUID_COLOR = "#00FF24"; private Paint tickPaint, circlePaint; private float scale; public TickController() { super(); tickPath = new Path(); tickPoint1 = new PointF(); tickPoint2 = new PointF(); tickPoint3 = new PointF(); tickPaint = new Paint(Paint.ANTI_ALIAS_FLAG); tickPaint.setDither(true); tickPaint.setColor(Color.WHITE); tickPaint.setStrokeCap(Paint.Cap.ROUND); tickPaint.setStyle(Paint.Style.STROKE); circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); circlePaint.setDither(true); circlePaint.setStyle(Paint.Style.FILL); circlePaint.setColor(Color.parseColor(LIQUID_COLOR)); } @Override public Animator buildAnimator() { return getBaseAnimator(TICK_ANIMATION_DURATION, new OvershootInterpolator(TICK_OVERSHOOT_TENSION)); } @Override public void reset() { scale = 1.0f; tickControl2 = null; tickControl3 = null; } @Override public void getMeasure(int width, int height) { super.getMeasure(width, height); float left = centerX - radius; float top = centerY - radius; tickPoint1.x = left + (ticksCoordinates[0] * 2 * radius); tickPoint1.y = top + (ticksCoordinates[1] * 2 * radius); tickPoint2.x = left + (ticksCoordinates[2] * 2 * radius); tickPoint2.y = top + (ticksCoordinates[3] * 2 * radius); tickPoint3.x = left + (ticksCoordinates[4] * 2 * radius); tickPoint3.y = top + (ticksCoordinates[5] * 2 * radius); tickPaint.setStrokeWidth(radius / 12); } @Override public void draw(Canvas canvas) { canvas.scale(scale, scale, centerX, centerY); drawCircle(canvas); drawTick(canvas); } private void drawCircle(Canvas canvas) { canvas.drawCircle(centerX, centerY, radius, circlePaint); } private void drawTick(Canvas canvas) { tickPath.reset(); tickPath.moveTo(tickPoint1.x, tickPoint1.y); if (tickControl2 != null) { tickPath.lineTo(tickControl2.x, tickControl2.y); } if (tickControl3 != null) { tickPath.lineTo(tickControl3.x, tickControl3.y); } canvas.drawPath(tickPath, tickPaint); } @Override protected void setRender(float interpolatedTime) { super.setRender(interpolatedTime); computeScale(interpolatedTime); computeTick(interpolatedTime); } private void computeScale(float interpolatedTime) { float scaleDown = (1.0f - SCALE_DOWN_SIZE) * (interpolatedTime); scale = 1.0f - scaleDown; } private void computeTick(float interpolatedTime) { if (interpolatedTime <= 0.5f) { float dt = interpolatedTime / 0.5f; float dx = (tickPoint2.x - tickPoint1.x) * dt; float dy = (tickPoint2.y - tickPoint1.y) * dt; if (tickControl2 == null) { tickControl2 = new PointF(); } tickControl2.x = tickPoint1.x + dx; tickControl2.y = tickPoint1.y + dy; } else { float dt = (interpolatedTime - 0.5f) / 0.5f; float dx = (tickPoint3.x - tickPoint2.x) * dt; float dy = (tickPoint3.y - tickPoint2.y) * dt; if (tickControl3 == null) { tickControl3 = new PointF(); } tickControl3.x = tickPoint2.x + dx; tickControl3.y = tickPoint2.y + dy; } } }