Android 属性动画(Property Animation) ObjectAnimator的介绍

先说下属性动画与视图动画的区别:

视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到。视图动画系统也存在一些限制,因为它仅公开 对象的部分方面来供您添加动画效果;例如,您可以对视图的缩放和旋转添加动画效果,但无法对背景颜色这样做。

视图动画系统的另一个缺点是它只会在绘制视图的位置进行修改,而不会修改实际的视图本身。例如,如果您为某个按钮添加了动画效果,使其可以在屏幕上移动,该按钮会正确绘制,但能够点击按钮的实际位置并不会更改,因此您必须通过实现自己的逻辑来处理此事件。

为了更好的里面这句话我也写了一个demo 就是动画移动前点击图片有Toast 提示,图片移动之后点击图片没有Toast 提示,点击移动之后的空白界面却有Toast 提示,也就是view动画给图片设置点击事件移动之后点击事件不起作用了,如下图效果

录制的问题鼠标没有录制出来下面gif 后面图片不显示是点击了移动之后的图片,后面又显示了是点击上面的空白

有了属性动画系统,您就可以完

全摆脱这些束缚,还可以为任何对象(视图和非视图)的任何属性添加动画效果,并且实际修改的是对象本身。属性动画系统在执行动画方面也更为强健。概括地讲,您可以为要添加动画效果的属性(例如颜色、位置或大小)分配 Animator,还可以定义动画的各个方面,例如多个 Animator 的插值和同步。

不过,视图动画系统的设置需要的时间较短,需要编写的代码也较少。如果视图动画可以完成您需要执行的所有操作,或者现有代码已按照您需要的方式运行,则无需使用属性动画系统。在某些用例中,也可以针对不同的情况同时使用这两种动画系统。

属性动画的工作原理就不说了,详情的大家可以看官网 Android Developers 地址

动画的API 地址如果有忘记的属性可以点击查看

ObjectAnimator 的介绍:

A subclass of ValueAnimator that allows you to set a target object and object property to animate. This class updates the property accordingly when it computes a new value for the animation. You want to use ObjectAnimator most of the time, because it makes the process of animating values on target objects much easier. However, you sometimes want to use ValueAnimator directly because ObjectAnimator  has a few more restrictions, such as requiring specific accessor methods to be present on the target object.

大致意思:ValueAnimator的子类,用于设置目标对象和对象属性以添加动画效果。此类会在计算出动画的新值后相应地更新属性,

ValueAnimator  和 ObjectAnimator  明显的区别

ValueAnimator 动画需要手动的赋值 (比如不断控制 值 的变化 最后还需要手动刷新动画才能显示出来)

ObjectAnimator 动画是不需要手动赋值(比如不断控制 值 的变化ObjectAnimator  自己会刷新),

ObjectAnimator 的方法:

Alpha控制View的透明度

TranslationX控制X方向的位移

TranslationY控制Y方向的位移

ScaleX控制X方向的缩放倍数

ScaleY控制Y方向的缩放倍数

Rotation控制以屏幕方向为轴的旋转度数

RotationX控制以X轴为轴的旋转度数

RotationY控制以Y轴为轴的旋转度数

下面详细说下每个方法啊

1 translationY 实现的动画如下

java 代码实现的方法

   // 指定动画类型设置属性数值的初始值和结束值
                ObjectAnimator translationY =
                        ObjectAnimator.ofFloat(imageView, "translationY", 0, 600);
                // 延迟0.5 毫秒
                translationY.setStartDelay(500);
                // 动画时间这里是毫秒
                translationY.setDuration(2000);
                // 设置动画次数-1 为重复播放其他次数为n+1次 例如0是1次 1是2次一次类推
                translationY.setRepeatCount(-1);
                // 动画的下次执行开始位置,RESTART表示动画每次从原始的状态执行,
                // REVERSE表示动画第二次执行要从第一次改变后的状态逆向执行
                translationY.setRepeatMode(ValueAnimator.REVERSE);
                // 开始动画
                translationY.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:propertyName="translationY"
        android:repeatCount="-1"
        android:repeatMode="reverse"
        android:valueFrom="0"
        android:valueTo="600"
        android:valueType="floatType" />

 然后java 代码调用xml里面的动画

  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,
                                R.animator.object_animator);
                animator.setTarget(imageView);
                animator.start();

2 translationX 实现的动画如下

 

java 代码实现的方法

   // 指定动画类型设置属性数值的初始值和结束值
                ObjectAnimator translationY =
                        ObjectAnimator.ofFloat(imageView, "translationX", 0,
                                200, 0, -200, 0);
                // 延迟0.5 毫秒
                translationY.setStartDelay(500);
                // 动画时间这里是毫秒
                translationY.setDuration(2000);
                // 设置动画次数-1 为重复播放其他次数为n+1次 例如0是1次 1是2次一次类推
                translationY.setRepeatCount(-1);
                // 动画的下次执行开始位置,RESTART表示动画每次从原始的状态执行,
                // REVERSE表示动画第二次执行要从第一次改变后的状态逆向执行
                translationY.setRepeatMode(ValueAnimator.RESTART);
                // 开始动画
                translationY.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_translationx_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:propertyName="translationX"
        android:repeatCount="-1"
        android:repeatMode="reverse"
        android:valueFrom="0"
        android:valueTo="300"
        android:valueType="floatType" />

 然后java 代码调用xml里面的动画

 Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,
                        R.animator.object_translationx_animator);
                animator.setTarget(imageView);
                animator.start();

3 平移x和y 实现的动画如下

java 代码实现方式如下

   // 这里主要是为了说下合集动画使用AnimatorSet
                                AnimatorSet translationAnimatorSet = new AnimatorSet();
                                translationAnimatorSet.playTogether(
                                        ObjectAnimator.ofFloat(imageView, "translationX", 0, 200)
                                                .setDuration(2000),
                                        ObjectAnimator.ofFloat(imageView, "translationY", 0, 600)
                                                .setDuration(2000));
                                translationAnimatorSet.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_translationset_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <objectAnimator
            android:duration="3000"
            android:propertyName="translationX"
            android:repeatCount="-1"
            android:repeatMode="reverse"
            android:valueFrom="0"
            android:valueTo="300"
            android:valueType="floatType" />

    <objectAnimator
            android:duration="3000"
            android:propertyName="translationY"
            android:repeatCount="-1"
            android:repeatMode="reverse"
            android:valueFrom="0"
            android:valueTo="600"
            android:valueType="floatType" />
</set>

然后java 代码调用xml里面的动画

  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,
                        R.animator.object_translationset_animator);
                animator.setTarget(imageView);
                animator.start();

4  scaleX 实现的动画如下

java 代码实现方式如下

   // 指定动画类型设置属性数值的初始值和结束值
                ObjectAnimator scaleY =
                        ObjectAnimator.ofFloat(imageView, "scaleX", 0, 3, 0);
                // 延迟0.5 毫秒
                scaleY.setStartDelay(500);
                // 动画时间这里是毫秒
                scaleY.setDuration(2000);
                // 设置动画次数-1 为重复播放其他次数为n+1次 例如0是1次 1是2次一次类推
                scaleY.setRepeatCount(-1);
                // 动画的下次执行开始位置,RESTART表示动画每次从原始的状态执行,
                // REVERSE表示动画第二次执行要从第一次改变后的状态逆向执行
                scaleY.setRepeatMode(ValueAnimator.RESTART);
                // 开始动画
                scaleY.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_scalex_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:propertyName="scaleX"
        android:repeatCount="-1"
        android:repeatMode="reverse"
        android:valueFrom="0"
        android:valueTo="2"
        android:valueType="floatType" />

然后java 代码调用xml里面的动画

  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,
                        R.animator.object_scalex_animator);
                animator.setTarget(imageView);
                animator.start();

5 scaleY 实现动画效果如下

java 代码实现方式如下

  // 指定动画类型设置属性数值的初始值和结束值
                ObjectAnimator scaleY =
                        ObjectAnimator.ofFloat(imageView, "scaleY", 0, 3, 0);
                // 延迟0.5 毫秒
                scaleY.setStartDelay(500);
                // 动画时间这里是毫秒
                scaleY.setDuration(2000);
                // 设置动画次数-1 为重复播放其他次数为n+1次 例如0是1次 1是2次一次类推
                scaleY.setRepeatCount(-1);
                // 动画的下次执行开始位置,RESTART表示动画每次从原始的状态执行,
                // REVERSE表示动画第二次执行要从第一次改变后的状态逆向执行
                scaleY.setRepeatMode(ValueAnimator.RESTART);
                // 开始动画
                scaleY.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_scaley_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:propertyName="scaleY"
        android:repeatCount="-1"
        android:repeatMode="reverse"
        android:valueFrom="0"
        android:valueTo="2"
        android:valueType="floatType" />

然后java 代码调用xml里面的动画

  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,
                        R.animator.object_scaley_animator);
                animator.setTarget(imageView);
                animator.start();

6 scale X和Y 实现动画如下

java 代码实现如下

    //缩放
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.playTogether(
                        ObjectAnimator.ofFloat(imageView, "scaleX", 1, 0, 1)
                                .setDuration(2000),
                        ObjectAnimator.ofFloat(imageView, "scaleY", 1, 0, 1)
                                .setDuration(2000)
                );
                animatorSet.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_scalexy_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
            android:duration="3000"
            android:propertyName="scaleX"
            android:repeatCount="-1"
            android:repeatMode="reverse"
            android:valueFrom="0"
            android:valueTo="2"
            android:valueType="floatType" />

    <objectAnimator
            android:duration="3000"
            android:propertyName="scaleY"
            android:repeatCount="-1"
            android:repeatMode="reverse"
            android:valueFrom="0"
            android:valueTo="2"
            android:valueType="floatType" />
</set>

然后在java 代码中调用动画

Animator animator = AnimatorInflater.loadAnimator
                        (ObjectAnimatorActivity.this,
                                R.animator.object_scalexy_animator);
                animator.setTarget(imageView);
                animator.start();

7 rotationx 实现动画如下

java 代码实现如下

  // 指定动画类型设置属性数值的初始值和结束值
                ObjectAnimator rotation =
                        ObjectAnimator.ofFloat(imageView, "rotationX", 0, 360);
                // 延迟0.5 毫秒
                rotation.setStartDelay(500);
                // 动画时间这里是毫秒
                rotation.setDuration(2000);
                // 设置动画次数-1 为重复播放其他次数为n+1次 例如0是1次 1是2次一次类推
                rotation.setRepeatCount(-1);
                // 动画的下次执行开始位置,RESTART表示动画每次从原始的状态执行,
                // REVERSE表示动画第二次执行要从第一次改变后的状态逆向执行
                rotation.setRepeatMode(ValueAnimator.RESTART);
                // 开始动画
                rotation.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_rotationx_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:propertyName="rotationX"
        android:repeatCount="-1"
        android:repeatMode="reverse"
        android:valueFrom="0"
        android:valueTo="360"
        android:valueType="floatType" />

然后在java 代码中调用动画

  Animator animator = AnimatorInflater.loadAnimator
                        (ObjectAnimatorActivity.this,
                                R.animator.object_rotationx_animator);
                animator.setTarget(imageView);
                animator.start();

8 rotationy 实现动画如下

java 代码实现如下

   // 指定动画类型设置属性数值的初始值和结束值
                ObjectAnimator rotation =
                        ObjectAnimator.ofFloat(imageView, "rotationY", 0, 360);
                // 延迟0.5 毫秒
                rotation.setStartDelay(500);
                // 动画时间这里是毫秒
                rotation.setDuration(2000);
                // 设置动画次数-1 为重复播放其他次数为n+1次 例如0是1次 1是2次一次类推
                rotation.setRepeatCount(-1);
                // 动画的下次执行开始位置,RESTART表示动画每次从原始的状态执行,
                // REVERSE表示动画第二次执行要从第一次改变后的状态逆向执行
                rotation.setRepeatMode(ValueAnimator.RESTART);
                // 开始动画
                rotation.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_rotationy_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:propertyName="rotationY"
        android:repeatCount="-1"
        android:repeatMode="reverse"
        android:valueFrom="0"
        android:valueTo="360"
        android:valueType="floatType" />

然后在java 代码中调用动画

 Animator animator = AnimatorInflater.loadAnimator
                        (ObjectAnimatorActivity.this,
                                R.animator.object_rotationy_animator);
                animator.setTarget(imageView);
                animator.start();

9  rotation 实现动画如下

java 代码实现如下

  // 指定动画类型设置属性数值的初始值和结束值
                ObjectAnimator rotation =
                        ObjectAnimator.ofFloat(imageView, "rotation", 0, 360);
                // 延迟0.5 毫秒
                rotation.setStartDelay(500);
                // 动画时间这里是毫秒
                rotation.setDuration(2000);
                // 设置动画次数-1 为重复播放其他次数为n+1次 例如0是1次 1是2次一次类推
                rotation.setRepeatCount(-1);
                // 动画的下次执行开始位置,RESTART表示动画每次从原始的状态执行,
                // REVERSE表示动画第二次执行要从第一次改变后的状态逆向执行
                rotation.setRepeatMode(ValueAnimator.RESTART);
                // 开始动画
                rotation.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_rotation_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:propertyName="rotation"
        android:repeatCount="-1"
        android:repeatMode="reverse"
        android:valueFrom="0"
        android:valueTo="360"
        android:valueType="floatType" />

然后java 代码调用xml 动画

 Animator animator = AnimatorInflater.loadAnimator
                        (ObjectAnimatorActivity.this,
                                R.animator.object_rotation_animator);
                animator.setTarget(imageView);
                animator.start();

当然你也可以使用x和y 组合实现旋转,这里就不再说了,动画合集里面写2个旋转即可

10 alpha 透明度实现的动画如下

java 代码如下

 // 指定动画类型设置属性数值的初始值和结束值
                ObjectAnimator alpha =
                        ObjectAnimator.ofFloat(imageView, "alpha", 1, 0, 1);
                // 延迟0.5 毫秒
                alpha.setStartDelay(500);
                // 动画时间这里是毫秒
                alpha.setDuration(2000);
                // 设置动画次数-1 为重复播放其他次数为n+1次 例如0是1次 1是2次一次类推
                alpha.setRepeatCount(-1);
                // 动画的下次执行开始位置,RESTART表示动画每次从原始的状态执行,
                // REVERSE表示动画第二次执行要从第一次改变后的状态逆向执行
                alpha.setRepeatMode(ValueAnimator.RESTART);
                // 开始动画
                alpha.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_alpha_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:propertyName="alpha"
        android:repeatCount="-1"
        android:repeatMode="reverse"
        android:valueFrom="1"
        android:valueTo="0"
        android:valueType="floatType" />

然后java 代码调用xml 的动画如下

   Animator animator = AnimatorInflater.loadAnimator
                        (ObjectAnimatorActivity.this,
                                R.animator.object_alpha_animator);
                animator.setTarget(imageView);
                animator.start();

最后 写一个组合动画

实现效果如下

java 代码实现如下

   AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.playTogether(
                        ObjectAnimator.ofFloat(imageView, "translationY", 0, 600)
                                .setDuration(3000),
                        ObjectAnimator.ofFloat(imageView, "scaleX", 1, 0, 1)
                                .setDuration(3000),
                        ObjectAnimator.ofFloat(imageView, "rotation", 0, 360)
                                .setDuration(3000),
                        ObjectAnimator.ofFloat(imageView, "alpha", 1, 0, 1)
                );

                animatorSet.start();

xml 实现的方法如下

创建 1个animator的文件夹 然后object_set_animator.xml 的文件 里面的内容如下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
            android:duration="3000"
            android:propertyName="translationY"
            android:repeatCount="-1"
            android:repeatMode="reverse"
            android:valueFrom="0"
            android:valueTo="600"
            android:valueType="floatType" />

    <objectAnimator
            android:duration="3000"
            android:propertyName="scaleX"
            android:repeatCount="-1"
            android:repeatMode="reverse"
            android:valueFrom="0"
            android:valueTo="1"
            android:valueType="floatType" />


    <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:repeatCount="-1"
            android:repeatMode="reverse"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" />


    <objectAnimator
            android:duration="3000"
            android:propertyName="alpha"
            android:repeatCount="-1"
            android:repeatMode="reverse"
            android:valueFrom="1"
            android:valueTo="0"
            android:valueType="floatType" />
</set>

然后在java 代码调用xml 动画如下

     Animator animator = AnimatorInflater.loadAnimator
                                (ObjectAnimatorActivity.this,
                                        R.animator.object_set_animator);
                                animator.setTarget(imageView);
                                animator.start();

猜你喜欢

转载自blog.csdn.net/qq_33210042/article/details/107950069