package cn.pedant.SweetAlert; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.view.View; import android.view.animation.Animation; import android.view.animation.Transformation; public class SuccessTickView extends View { private float mDensity = -1; private Paint mPaint; private final float CONST_RADIUS = dip2px(1.2f); private final float CONST_RECT_WEIGHT = dip2px(3); private final float CONST_LEFT_RECT_W = dip2px(15); private final float CONST_RIGHT_RECT_W = dip2px(25); private final float MIN_LEFT_RECT_W = dip2px(3.3f); private final float MAX_RIGHT_RECT_W = CONST_RIGHT_RECT_W + dip2px(6.7f); private float mMaxLeftRectWidth; private float mLeftRectWidth; private float mRightRectWidth; private boolean mLeftRectGrowMode; public SuccessTickView(Context context) { super(context); init(); } public SuccessTickView(Context context, AttributeSet attrs){ super(context,attrs); init(); } private void init () { mPaint = new Paint(); mPaint.setColor(getResources().getColor(R.color.success_stroke_color)); mLeftRectWidth = CONST_LEFT_RECT_W; mRightRectWidth = CONST_RIGHT_RECT_W; mLeftRectGrowMode = false; } @Override public void draw(Canvas canvas) { super.draw(canvas); int totalW = getWidth(); int totalH = getHeight(); // rotate canvas first canvas.rotate(45, totalW / 2, totalH / 2); totalW /= 1.2; totalH /= 1.4; mMaxLeftRectWidth = (totalW + CONST_LEFT_RECT_W) / 2 + CONST_RECT_WEIGHT - 1; RectF leftRect = new RectF(); if (mLeftRectGrowMode) { leftRect.left = 0; leftRect.right = leftRect.left + mLeftRectWidth; leftRect.top = (totalH + CONST_RIGHT_RECT_W) / 2; leftRect.bottom = leftRect.top + CONST_RECT_WEIGHT; } else { leftRect.right = (totalW + CONST_LEFT_RECT_W) / 2 + CONST_RECT_WEIGHT - 1; leftRect.left = leftRect.right - mLeftRectWidth; leftRect.top = (totalH + CONST_RIGHT_RECT_W) / 2; leftRect.bottom = leftRect.top + CONST_RECT_WEIGHT; } canvas.drawRoundRect(leftRect, CONST_RADIUS, CONST_RADIUS, mPaint); RectF rightRect = new RectF(); rightRect.bottom = (totalH + CONST_RIGHT_RECT_W) / 2 + CONST_RECT_WEIGHT - 1; rightRect.left = (totalW + CONST_LEFT_RECT_W) / 2; rightRect.right = rightRect.left + CONST_RECT_WEIGHT; rightRect.top = rightRect.bottom - mRightRectWidth; canvas.drawRoundRect(rightRect, CONST_RADIUS, CONST_RADIUS, mPaint); } public float dip2px(float dpValue) { if(mDensity == -1) { mDensity = getResources().getDisplayMetrics().density; } return dpValue * mDensity + 0.5f; } public void startTickAnim () { // hide tick mLeftRectWidth = 0; mRightRectWidth = 0; invalidate(); Animation tickAnim = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); if (0.54 < interpolatedTime && 0.7 >= interpolatedTime) { // grow left and right rect to right mLeftRectGrowMode = true; mLeftRectWidth = mMaxLeftRectWidth * ((interpolatedTime - 0.54f) / 0.16f); if (0.65 < interpolatedTime) { mRightRectWidth = MAX_RIGHT_RECT_W * ((interpolatedTime - 0.65f) / 0.19f); } invalidate(); } else if (0.7 < interpolatedTime && 0.84 >= interpolatedTime) { // shorten left rect from right, still grow right rect mLeftRectGrowMode = false; mLeftRectWidth = mMaxLeftRectWidth * (1 - ((interpolatedTime - 0.7f) / 0.14f)); mLeftRectWidth = mLeftRectWidth < MIN_LEFT_RECT_W ? MIN_LEFT_RECT_W : mLeftRectWidth; mRightRectWidth = MAX_RIGHT_RECT_W * ((interpolatedTime - 0.65f) / 0.19f); invalidate(); } else if (0.84 < interpolatedTime && 1 >= interpolatedTime) { // restore left rect width, shorten right rect to const mLeftRectGrowMode = false; mLeftRectWidth = MIN_LEFT_RECT_W + (CONST_LEFT_RECT_W - MIN_LEFT_RECT_W) * ((interpolatedTime - 0.84f) / 0.16f); mRightRectWidth = CONST_RIGHT_RECT_W + (MAX_RIGHT_RECT_W - CONST_RIGHT_RECT_W) * (1 - ((interpolatedTime - 0.84f) / 0.16f)); invalidate(); } } }; tickAnim.setDuration(750); tickAnim.setStartOffset(100); startAnimation(tickAnim); } }