1. 程式人生 > >Android屬性動畫與自定義控制元件畫圓球移動

Android屬性動畫與自定義控制元件畫圓球移動

com.bwei.administrator.yuekao; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Paint; import
android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; /** * Created by dell-pc on 2017/10/25. */ public class CircleView extends View { /** * 定義畫筆 */ private Paint paint; private Point currentPoint; public static final float RADIUS = 50f; public
CircleView(Context context) { super(context); } public CircleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); paint = new Paint(); } public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super
(context, attrs, defStyleAttr); } /** * 定義原點類 */ public class Point{ private float x; private float y; public Point(float x,float y){ this.x=x; this.y=y; } public float getX(){ return x; } public float getY(){ return y; } } /** * 在自定義模式裡計算從開始到結束 原點的差值 */ class PointEvalustor implements TypeEvaluator { /** * 值 = 開始值 + 分段 * (結束值 - 開始值) * @param fraction 部分 * @param startValue 開始值 * @param endValue 結束值 * @return 返回原點類物件 */ @Override public Object evaluate(float fraction, Object startValue, Object endValue) { Point startPoint= (Point) startValue; Point endPoint= (Point) endValue; float x=startPoint.getX()+fraction*(endPoint.getX()-startPoint.getX()); float y=startPoint.getY()+fraction*(endPoint.getY()-startPoint.getY()); return new Point(x,y); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(currentPoint == null){ currentPoint = new Point(RADIUS,RADIUS); canvas.drawCircle(currentPoint.getX(),currentPoint.getY(),RADIUS,paint); //設定動畫效果的方法 startAnim(); }else{ canvas.drawCircle(currentPoint.getX(),currentPoint.getY(),RADIUS,paint); } } /** * 設定動畫效果的方法 */ private void startAnim() { Point startPoint = new Point(RADIUS,RADIUS); Point endPoint = new Point(getWidth()-RADIUS,getHeight()-RADIUS); ValueAnimator valueAnimator = ValueAnimator.ofObject(new PointEvalustor(), startPoint, endPoint); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { if(valueAnimator != null){ currentPoint = (Point) valueAnimator.getAnimatedValue(); invalidate(); } } }); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(valueAnimator); animatorSet.setDuration(5000); animatorSet.start(); valueAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { //動畫結束後 跳轉至下一頁面 getContext().startActivity(new Intent(getContext(), MainActivity.class)); } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); } }