Android 属性动画(Property Animation) ObjectAnimator的介绍
先说下属性动画与视图动画的区别:
视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到。视图动画系统也存在一些限制,因为它仅公开 对象的部分方面来供您添加动画效果;例如,您可以对视图的缩放和旋转添加动画效果,但无法对背景颜色这样做。
视图动画系统的另一个缺点是它只会在绘制视图的位置进行修改,而不会修改实际的视图本身。例如,如果您为某个按钮添加了动画效果,使其可以在屏幕上移动,该按钮会正确绘制,但能够点击按钮的实际位置并不会更改,因此您必须通过实现自己的逻辑来处理此事件。
为了更好的里面这句话我也写了一个demo 就是动画移动前点击图片有Toast 提示,图片移动之后点击图片没有Toast 提示,点击移动之后的空白界面却有Toast 提示,也就是view动画给图片设置点击事件移动之后点击事件不起作用了,如下图效果
录制的问题鼠标没有录制出来下面gif 后面图片不显示是点击了移动之后的图片,后面又显示了是点击上面的空白
有了属性动画系统,您就可以完
全摆脱这些束缚,还可以为任何对象(视图和非视图)的任何属性添加动画效果,并且实际修改的是对象本身。属性动画系统在执行动画方面也更为强健。概括地讲,您可以为要添加动画效果的属性(例如颜色、位置或大小)分配 Animator,还可以定义动画的各个方面,例如多个 Animator 的插值和同步。
不过,视图动画系统的设置需要的时间较短,需要编写的代码也较少。如果视图动画可以完成您需要执行的所有操作,或者现有代码已按照您需要的方式运行,则无需使用属性动画系统。在某些用例中,也可以针对不同的情况同时使用这两种动画系统。
属性动画的工作原理就不说了,详情的大家可以看官网 Android Developers 地址
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();
本文地址:https://blog.csdn.net/qq_33210042/article/details/107950069
上一篇: Android 单元测试之UI测试
推荐阅读
-
Android 属性动画(Property Animation) ObjectAnimator的介绍
-
Android属性动画ObjectAnimator的使用1
-
Android动画基础--属性动画(Property Animation)_html/css_WEB-ITnose
-
Android属性动画Property Animation系列三之LayoutTransition(布局容器动画)_html/css_WEB-ITnose
-
Android动画基础--属性动画(Property Animation)_html/css_WEB-ITnose
-
Android属性动画Property Animation系列一之ObjectAnimator_html/css_WEB-ITnose
-
Android 属性动画(Property Animation) 使用详解
-
Android 动画(四)Property Animation(属性动画)
-
CSS3动画animation相关属性与关键帧规则keyframes的详细介绍
-
Android属性动画ObjectAnimator和ValueAnimator的简单应用