属性动画

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、

原文地址:https://www.cnblogs.com/hpustudent/p/4589813.html