package com.tomandjerry.coolanim.lib.letter; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import com.tomandjerry.coolanim.lib.Config; /** * Created by yanxing on 16/2/19. */ public class GLetter extends Letter { public final static int STROKE_WIDTH = 20; public final static int SHIFT = 60 - STROKE_WIDTH / 2; public final static int WIDTH = STROKE_WIDTH / 2 + 20; public final static int LEG_LENGTH = 120; private boolean isStart = false; private int mCurValue; private Path mPath; private Paint mPaint; // 圆 private RectF mRectF; private int mStartAngle; private int mSweepAngle; // g的下半圆 private RectF mRectFHalf; private int mSweepAngleHalf; private int mMoveX; private int mMoveY; private int mFv; // 判断是否进入了底部弧线绘制 private boolean isInRoundDraw = false; public GLetter(int x, int y) { super(x, y); mPath = new Path(); mMoveX = mCurX + SHIFT; mMoveY = mCurY - SHIFT; mPath.moveTo(mMoveX, mMoveY); mFv = mDuration * 2 / 3; mRectFHalf = new RectF(); mRectFHalf.set(mCurX - SHIFT, mCurY - SHIFT + LEG_LENGTH - SHIFT, mCurX + SHIFT, mCurY + SHIFT + LEG_LENGTH - SHIFT); mSweepAngleHalf = 0; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Config.WHITE); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(STROKE_WIDTH); mRectF = new RectF(); mRectF.set(mCurX - SHIFT, mCurY - SHIFT, mCurX + SHIFT, mCurY + SHIFT); mStartAngle = 0; mSweepAngle = 0; } @Override public void startAnim() { ValueAnimator animator = ValueAnimator.ofInt(0, mDuration); animator.setDuration(mDuration); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { if (!isStart) { return; } // 完整圆的路径 mCurValue = (int) animation.getAnimatedValue(); mSweepAngle = mCurValue * 360 / mDuration; // 计算g除了圆的J勾路线 if (mCurValue < mFv) { mMoveY = mCurY - SHIFT + LEG_LENGTH * mCurValue / mFv; mPath.lineTo(mMoveX, mMoveY); } else { if (!isInRoundDraw) { isInRoundDraw = true; mMoveY = mCurY - SHIFT + LEG_LENGTH; mPath.lineTo(mMoveX, mMoveY); } mCurValue -= mFv; mSweepAngleHalf = mCurValue * 180 / (mDuration - mFv); mPath.addArc(mRectFHalf, mStartAngle, mSweepAngleHalf); } } }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { isStart = true; } }); animator.start(); } @Override public void drawSelf(Canvas canvas) { // 勾子 canvas.drawPath(mPath, mPaint); // 圆 canvas.drawArc(mRectF, mStartAngle, mSweepAngle, false, mPaint); } }