PathMeasure加载完成

    xiaoxiao2021-03-26  8

    package com.example.cms.testmapshowdetaildemo; import android.animation.Animator; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PathMeasure; import android.graphics.RectF; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.view.View; /** * Created by cms on 2017/3/1. */ public class LoadingView extends View { private float mStrokeWidth = 10; private int loading_duration = 1500; private int endind_duration = 600; //动画处理 private Handler mAnimatorHandler; private Paint mPaint; private Path path_circle; private ValueAnimator mLoadingValueAnimator; private ValueAnimator.AnimatorUpdateListener mUpdateListener; private Animator.AnimatorListener animatorListener; private float animatedValue; //加载是否结束 private boolean isOver = false; private State mCurrentState = State.NONE; private ValueAnimator mEndingAnimator; private PathMeasure measure; private int count=0; private ValueAnimator mSucceedAnimator; private Path path_succeed; //状态 public static enum State{ NONE, STARTING, LOADING, ENDING, SUCCEED } public LoadingView(Context context) { this(context,null); } public LoadingView(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); initPath(); initListener(); initHandler(); initAnimator(); //进入开始动画 mCurrentState=State.STARTING; } private void initPaint() { mPaint = new Paint(); mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.STROKE); mPaint.setAntiAlias(true); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(mStrokeWidth); } private void initPath() { path_circle = new Path(); path_succeed = new Path(); measure = new PathMeasure(); RectF rectF = new RectF(-100,-100,100,100); path_circle.addArc(rectF,0,359.9f); measure.setPath(path_circle,false); path_succeed.moveTo(-65,25); path_succeed.lineTo(-10,65); path_succeed.lineTo(65,-35); } private void initListener() { mUpdateListener = new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { animatedValue = ((float) animation.getAnimatedValue()); invalidate(); } }; animatorListener = new ValueAnimator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { //发消息通知动画状态更新 mAnimatorHandler.sendEmptyMessage(0); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }; } private void initHandler() { mAnimatorHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (mCurrentState) { case STARTING: //从开始转变为加载状态 isOver=false; mCurrentState= State.LOADING; mLoadingValueAnimator.start(); break; case LOADING: if (!isOver){ //结束条件 isOver = true; count++; if (count>2) { isOver = true; } mLoadingValueAnimator.start(); }else { mCurrentState=State.ENDING; mEndingAnimator.start();//开始动画 } break; case ENDING: //从结束状态转变为无状态 mCurrentState=State.SUCCEED; mEndingAnimator.start(); break; case SUCCEED: mCurrentState=State.NONE; break; } } }; } private void initAnimator() { mLoadingValueAnimator = ValueAnimator.ofFloat(0,1).setDuration(loading_duration); mEndingAnimator = ValueAnimator.ofFloat(0,1).setDuration(endind_duration); mSucceedAnimator = ValueAnimator.ofFloat(0,1).setDuration(endind_duration); mLoadingValueAnimator.addUpdateListener(mUpdateListener); mEndingAnimator.addUpdateListener(mUpdateListener); mSucceedAnimator.addUpdateListener(mUpdateListener); mLoadingValueAnimator.addListener(animatorListener); mEndingAnimator.addListener(animatorListener); mSucceedAnimator.addListener(animatorListener); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawLoading(canvas); } private void drawLoading(Canvas canvas) { canvas.translate(getWidth()/2,getHeight()/2); canvas.drawColor(Color.GRAY); switch (mCurrentState) { case NONE: canvas.drawPath(path_circle,mPaint); break; case STARTING: mAnimatorHandler.sendEmptyMessage(0); break; case LOADING: measure.setPath(path_circle,false); float stop=animatedValue*measure.getLength(); float start=(float) (stop - ((0.5 - Math.abs(animatedValue - 0.5)) * 200f)); Path dst = new Path(); measure.getSegment(start,stop, dst,true); canvas.drawPath(dst,mPaint); break; case ENDING: measure.setPath(path_circle,false); Path dst2 = new Path(); measure.getSegment(0,animatedValue*measure.getLength(), dst2,true); canvas.drawPath(dst2,mPaint); break; case SUCCEED: canvas.drawPath(path_circle,mPaint); measure.setPath(path_succeed,false); Path dst3 = new Path(); measure.getSegment(0,animatedValue*measure.getLength(), dst3,true); canvas.drawPath(dst3,mPaint); break; } } }
    转载请注明原文地址: https://ju.6miu.com/read-500254.html

    最新回复(0)