屬性動畫 Property Animation

一、 Android動畫分類如下:

在這裏插入圖片描述

視圖動畫的缺陷:
對象的侷限性:僅限於View
只改變了View的視覺效果,而沒有改變View的屬性
動畫效果單一

屬性動畫的特點:
作用對象:任意對象,甚至沒對象也可以
作用方式:改變對象的屬性
動畫效果:按需自定義,不再侷限於上述4種基本變換

二、屬性動畫

1、ValueAnimator.ofObject()簡單示例
(1)自定義JavaBean類:

public class Point  {
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

(2)自定義估值器PointEvaluator類

public class PointEvaluator implements TypeEvaluator<Point> {
    @Override
    public Point evaluate(float fraction, Point startValue, Point endValue) {
        int x = (int) (startValue.getX() + fraction * (endValue.getX() - startValue.getX()));
        int y = (int) (startValue.getY() + fraction * (endValue.getY() - startValue.getY()));
        return new Point(x,y);
    }
}

(3)xml佈局只有一個button,此處省略
(4)Java功能類

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.but);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Point start= new Point(100,100);
                Point end = new Point(400,600);
                ValueAnimator valueAnimator = ValueAnimator.ofObject(new PointEvaluator(),
                        start,end);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        Point point = (Point) valueAnimator.getAnimatedValue();
                        Log.e(TAG,"point x= " + point.getX() + "point y= " + point.getY());
                        btn.setTranslationX(point.getX());
                        btn.setTranslationY(point.getY());
                        btn.requestLayout();
                    }
                });
                valueAnimator.setDuration(3000);
                valueAnimator.start();
            }
        });
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章