9. android动画《三》属性动画(property Animation)

属性动画(property Animation).jpg

一. 属性动画出现的原因

传统动画局限性:

  1. 作用对象局限:View
  2. 没有改变View的属性,只是改变视觉效果
  3. 动画效果单一,可扩展性有较大局限性

为了解决补间动画的缺陷,在 Android 3.0(API 11)开始,系统提供了一种全新的动画模式:属性动画(Property Animation)

二. 作用对象

任意java对象和属性

三. 原理

在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。

可是任意对象,任意属性

四. 分类

  1. ValueAnimator
  2. ObjectAnimator
  3. ViewPropertyAnimator(动画简写)
  4. AnimatorSet(组合动画)

五. 使用方式

1. ValueAnimator

(1) xml方式
res/animator/value_animator.xml




Activity中调用

public void setXmlValueAnimator() {
        anim = (ValueAnimator)AnimatorInflater.loadAnimator(this, R.animator.value_animator);
        setListener(anim);
    }

    /**
     * 设置监听
     * @param anim
     */
    public void setListener(ValueAnimator anim){
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //获取改变后的值
                int value = (Integer) animation.getAnimatedValue();
                //设置值
                tv.setText(value + "");
                tv.setWidth(value);
                //刷新
                tv.requestLayout();
            }
        });
        anim.start();
    }

注意: android:valueType=" "类型,要和需要赋值的类型一致。
例如:android:valueType="intType" 类型为int类型,tv.setWidth()需要的也是int类型,假如不一致可能会出错。

(2) java代码方式

public void setValueAnimator(){
        // ofInt() 作用有两个
        // 1. 创建动画实例
        // 2. 将传入的多个Int参数进行平滑过渡:此处传入0和1,表示将值从0平滑过渡到1
        // 如果传入了3个Int参数 a,b,c ,则是先从a平滑过渡到b,再从b平滑过渡到C,以此类推
        anim = ValueAnimator.ofInt(0, 500);
        anim.setDuration(5000); //时间
        setListener(anim); //动画监听 参考上面xml中的setListener()方法
    }
2. ObjectAnimator

(1) xml方式
res/animator/object_animator.xml




Activity中调用

  ObjectAnimator anim = (ObjectAnimator)AnimatorInflater.loadAnimator(this,   R.animator.object_animator);
  anim.setTarget(textView);
  anim.start();

说明:
android:propertyName="width" 属性说明
被作用的对象,必须要有setWidth()这个属性才可以;
假如初始化中没有赋值,那被作用的对象必须要有getWidth()这个方法。

(2) java代码方式

ObjectAnimator anim = ObjectAnimator.ofInt(textView, "width", 0, 500);
        anim.setRepeatCount(100);
        anim.setDuration(3000);
        anim.start();

自动赋值过程:
被作用的对象:textView
被作用的属性:width
执行的时候根据值的变化,自动设置textView.setWidth(变化的值)。
注意:假如初始化中没有赋值,那被作用的对象必须要有getWidth()这个方法。

3. ViewPropertyAnimator(动画简写)

用法如下: 链式调用设置属性,详细的参数代表什么意思这里就不写了。

 textView.animate()  //获取ViewPropertyAnimator对象
            .setDuration(3000)
            .x(0)
            .y(500);

特点:
1、专门针对View对象动画而操作的类。
2、提供了更简洁的链式调用设置多个属性动画,这些动画可以同时进行的。
3、拥有更好的性能,多个属性动画是一次同时变化,只执行一次UI刷新(也就是只调用一次invalidate,而n个ObjectAnimator就会进行n次属性变化,就有n次invalidate)。
4、每个属性提供两种类型方法设置。
5、该类只能通过View的animate()获取其实例对象的引用

4. AnimatorSet(组合动画)

(1) xml方式
res/animator/set_animator.xml




    
    
    
    
    

    

    

Activity中调用

        AnimatorSet animatorSet = (AnimatorSet)AnimatorInflater.loadAnimator(this, R.animator.set_animator);
        animatorSet.setTarget(textView);
        animatorSet.start();

(2) java代码方式

        //1.设置动画
        ObjectAnimator translation = ObjectAnimator.ofFloat(textView, "translationX", 0,500);//平移动画
        ObjectAnimator rotate = ObjectAnimator.ofFloat(textView, "rotation", 0f, 360f); // 旋转动画
        //2. 创建组合动画的对象
        AnimatorSet animSet = new AnimatorSet();
        //3. 按顺序组合动画
        animSet.play(translation).after(rotate).after(translation);
        animSet.setDuration(5000);
        //4.播放动画
        animSet.start();

六. 监听

1. 视图动画监听
Animation.addListener(AnimationListener)

2. 属性动画监听
Animator.addListener(AnimatorListenerAdapter)

3. 属性动画监听值的变化
Animator.addUpdateListener(ValueAnimator.AnimatorUpdateListener)

你可能感兴趣的:(9. android动画《三》属性动画(property Animation))