美文网首页
9. android动画《三》属性动画(property Ani

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

作者: liys_android | 来源:发表于2018-09-05 00:30 被阅读13次
    属性动画(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

    <?xml version="1.0" encoding="utf-8"?>
    <animator xmlns:android="http://schemas.android.com/apk/res/android"
        android:valueFrom="0"
        android:valueTo="500"
        android:duration="3000"
        android:valueType="intType"
        android:repeatCount="3">
    </animator>
    

    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

    <?xml version="1.0" encoding="utf-8"?>
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:valueFrom="100"
        android:valueTo="500"
        android:duration="3000"
        android:valueType="intType"
        android:repeatCount="3"
        android:propertyName="width">
    </objectAnimator>
    

    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

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:ordering="sequentially">
    
        <!--android:ordering=""-->
        <!--表示Set集合内的动画按顺序进行-->
        <!--ordering的属性值:sequentially & together-->
        <!--sequentially:表示set中的动画,按照先后顺序逐步进行(a 完成之后进行b)-->
        <!--together:表示set中的动画,在同一时间同时进行,为默认值-->
    
        <objectAnimator
            android:propertyName="TranslationX"
            android:duration="3000"
            android:valueType="floatType"
            android:valueFrom="100"
            android:valueTo="1000" />
    
        <objectAnimator
            android:propertyName="width"
            android:duration="3000"
            android:valueType="intType"
            android:valueFrom="0"
            android:valueTo="500"/>
    </set>
    

    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 Ani

          本文链接:https://www.haomeiwen.com/subject/lhkgwftx.html