Android屬性動畫與自定義控制元件畫圓球移動
阿新 • • 發佈:2019-01-08
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) {
}
});
}
}