属性动画

1、ValueAnimator

(1)继承关系图

属性动画

继承自父类Animator

(2)创建对象,一般来说,常用来创建ValueAnimator的对象为静态方法ofInt,ofFloat,ofPropertyValuesHolder,ofObject,在内部实际上也是调用相关的属性构造对象

 public static ValueAnimator ofInt(int... values) {

        ValueAnimator anim = new ValueAnimator();

        anim.setIntValues(values);

        return anim;

 }

(3)启动动画:start

(4)监听值变化事件:addUpdateListener

(5)实例:点击按钮开始动画,改变TextView的文字

        btnStart.setOnClickListener(new OnClickListener() {

            

            @SuppressLint("NewApi")

            @Override

            public void onClick(View v) {

                

                ValueAnimator animator = ValueAnimator.ofFloat(0, 1f, 3f, 100f,1000f);

                animator.setDuration(300).addUpdateListener(new AnimatorUpdateListener() {

                    

                    @Override

                    public void onAnimationUpdate(ValueAnimator animation) {

                        tvText.setText(animation.getAnimatedValue()+"");

                    }

                });

                animator.start();

            }

        });

        

属性动画

2、ObjectAnimator

(1)类集成关系图

属性动画

可以看到ObjectAnimator也是继承自ValueAnimator.

(2)创建对象

创建ObjectAnimator对象的方法和ValueAnimator类似,但是增加了一个属性参数,拿ofFloat来说,源码:

 public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {

        ObjectAnimator anim = new ObjectAnimator(target, propertyName);

        anim.setFloatValues(values);

        return anim;

    }

创建的时候也是调用了构造函数,构造函数中再去调用setPropertyName,将属性传入,以便后边对属性进行修改。

(3)实例:将按钮先左移后回到原先的位置

btnStart = (Button)findViewById(R.id.btn_start);

        btnTest = (Button)findViewById(R.id.testButton);

        

        btnStart.setOnClickListener(new OnClickListener() {

            

            @SuppressLint("NewApi") @Override

            public void onClick(View v) {

                float transX = btnTest.getTranslationX();

                ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnTest, "translationX", transX, -1 * btnTest.getWidth(), transX);

                objectAnimator.setDuration(3000);

                objectAnimator.start();

            }

        });

属性动画

3、组合动画AnimatorSet实现多重效果

(1)继承关系

属性动画

(2)实例:让按钮向右移动的同时向下移动

    btnStart.setOnClickListener(new OnClickListener() {

            

            @SuppressLint("NewApi")

            @Override

            public void onClick(View v) {

                ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnTest, "translationX", btnTest.getTranslationX(), 500);

                ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(btnTest, "translationY", btnTest.getTranslationY(), 300);

                

                

                AnimatorSet animatorSet = new AnimatorSet();

                

                //animatorSet.play()

                //.with()

                //.before()

                //.after();

                

                animatorSet.play(objectAnimator1).with(objectAnimator2);

                animatorSet.setDuration(3000);

                animatorSet.start();

            }

        });

        

属性动画

4、改变运动方式可以使用setInterpolator,进行设置,

监听动画的状态,如开始,结束,取消等,使用addListener进行设置或者使用AnimatorListenerAdapter设置监听部分动作

animatorSet.addListener(new AnimatorListener() {

                    

                    @Override

                    public void onAnimationStart(Animator animation) {

                        // TODO Auto-generated method stub

                        

                    }

                    

                    @Override

                    public void onAnimationRepeat(Animator animation) {

                        // TODO Auto-generated method stub

                        

                    }

                    

                    @Override

                    public void onAnimationEnd(Animator animation) {

                        // TODO Auto-generated method stub

                        

                    }

                    

                    @Override

                    public void onAnimationCancel(Animator animation) {

                        // TODO Auto-generated method stub

                        

                    }

                });

 5、使用xml布局写属性动画

(1)创建animator文件夹

(2)设置动画的对象

(3)实例

<?xml version="1.0" encoding="utf-8"?>

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 

    android:duration="1000"

    android:propertyName="translationX"

    android:valueFrom="0dp"

    android:valueTo="100dp">

</objectAnimator>
                Animator animator = AnimatorInflater.loadAnimator(AnimatorSetActivity.this, R.animator.trans_btntest);

                animator.setTarget(btnTest);

                animator.start();

(4)xml布局实现组合动画,很简单,只需要将两个animator卸载set中,进行加载执行就好。

这里:属性中可以标注是顺序播放或者是同时播放的关系。

<animator> 对应代码中的ValueAnimator
<objectAnimator> 对应代码中的ObjectAnimator
<set> 对应代码中的AnimatorSet

<?xml version="1.0" encoding="utf-8"?>



<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator 

        android:duration="1000"

        android:propertyName="translationX"

        android:valueFrom="0dp"

        android:valueTo="100dp">

    </objectAnimator>

    

    

    <objectAnimator 

        android:duration="1000"

        android:propertyName="translationY"

        android:valueFrom="0dp"

        android:valueTo="100dp">

    </objectAnimator>

</set>

6、

你可能感兴趣的:(动画)