Android动画学习(四)之属性动画学习
概述
属性动画是Android3.0版本推出的动画框架,其功能和拓展性都很强。从某种角度来看,属性动画是增强版的补
间动画。
与补间动画相比,属性动画的强大可以体现在如下两方面。
- 补间动画只能定义View上控件在“透明度”、“旋转”、“缩放”、“位移” 4个方面的状态变化,但属性动画可以定义任何属性的变化。
- 补间动画只能对 UI 组件执行动画,但属性动画几乎可以对任何对象执行动画。
属性动画实现主要由两方面组成:
①计算各帧的相关属性值;
②为指定对象设置这些计算后的值。
属性动画的机制
属性动画的机制已经不是再针对于View而进行设计的了,而是一种不断地对值进行操作的机制,它可以将值赋值到指定对象的指定属性上。
属性动画要求动画作用的对象提供该属性的set方法,苏弧形动画会根据你传递的该属性的初始值和最终值,以动画的效果多次调用set方法。每次传递个set方法的值东不一样,随着时间的推移,所传递的值越来越接近最终值。如果动画没有传递初始值,那么还要提供get方法,因为系统要去获取属性的初始值。
属性动画的的API
Animator :
它提供了创建属性动画的基类。通常该类只用于被继承并重写它的相关方法。比如自定义Animator 。
ValueAnimator :
属性动画主要的时间引擎,它负责计算各个帧的属性值。它定义了属
性动画的绝大部分核心功能,包括计算各帧的相关属性值,负责处理更新事件,按属
性值的类型控制计算规则。因此程序员必须根据 ValueAnimator 计算并监听值更新来更新对象的相关属性值。
ObjectAnimator :
它是 ValueAnimator 的子类,允许程序员对指定对象的属性执行动画。在实际应用中, ObjectAnimator 使用起来更加简单,因此更加常用。在少数场景下,由于 Object Animator 存在一些限制,可能需要考虑使用ValueAnimator 。
AnimatorSet :
它是Animator的子类,用于组合多个Animator , 并指定多个Animator是按次序播放,还是同时播放。
属性动画常用方法:
void start() 开始动画
void setDuration(long durationMillis) :设置持续时间(单位ms)
void setRepeatCount(int value):设置重复动画,设置为 0 表示不循环,设置为 ValueAnimation.INFINITE 表示无限循环
void setRepeatMode(int value):设置循环模式,取值为 ValueAnimation.RESTART 时,表示正序重新开始,当取值为 ValueAnimation.REVERSE 表示倒序重新开始。
addListener(AnimatorListener listener):设置监听动画过程
addPauseListener(Animator.AnimatorPauseListener listener) 添加一个暂停监听器
addUpdateListener(AnimatorUpdateListener listener):监听动画每一帧的值
void setInterpolator(TimeInterpolator value):设置插值器属性
基本使用
ValueAnimator
概述
属性动画中ValueAnimator是对值进行了一个平滑的动画过渡的动画。在两个数值范围内,顺序地产生过渡数值,过渡速率可以通过Intepolator来控制。
父类
Animator—所有属性动画的基类
构建动画的方法
先介绍几个概念:
values:设定ValueAnimatord的类型值
TypeEvaluator:插值器,设置动画系统如何从初始值过度到结束值
PropertyValuesHolder: 作用就是持有一个属性和它的开始值结束值
1、ofFloat:设置动画过渡值为float类型的ValueAnimator
构造并返回一个在浮点值之间进行动画的ValueAnimator,比如参数为(0.5f,1.0f)
public static ValueAnimator ofFloat(float... values)
参数说明:
参数类型都是可变参数长参数,可以传入任何float类型的值;传进去的值列表,就表示动画时的变化范围。
2、ofInt:设置动画过渡值为int类型的ValueAnimator
构造并返回一个在int值之间进行动画的ValueAnimator,比如参数为(0,360)
public static ValueAnimator ofInt(int... values)
参数说明:
参数类型都是可变参数长参数,可以传入任何int类型的值;传进去的值列表,就表示动画时的变化范围
3、ofObject:设置动画过渡值为float类型的ValueAnimator
构造并返回一个在对象值之间进行动画的ValueAnimator,evaluator为插值器,可以使用自带的,也可以自定义插值器。详细介绍看下面高级属性讲解。
public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)
参数说明:
evaluator:是自定义的 Evaluator;
values,可变参数长参数。
由上面源码可见,ofObject不能直接操作可见,可以在其addUpdateListener方法中操作,该方法通常适用于自定义View。
4、ofArgb:设置动画过渡值为color类型的ValueAnimator
构造并返回一个在颜色值值之间进行动画的ValueAnimator
public static ValueAnimator ofArgb(int... values)
参数说明:
values:可变的颜色参数。一般不使用,自定义颜色比ofArgb效果强大。
5、ofPropertyValuesHolder
构造并返回动画 ValueAnimator 之间的 PropertyValuesHolder 对象中指定的值。
在PropertyValuesHolder指定不同属性动画,同时操作多个不同属性的ValueAnimator 。
public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values)
参数说明:
values:一个或多个PropertyValuesHolder
ValueAnimator 创建动画
使用ValueAnimator创建动画可按如下4个步骤进行。
- 调用 ValueAnimator 的 oflnt() 、 ofFloat()、ofArgb() 或 ofObject()静态方法创建ValueAnimator 实例。
- 调用ValueAnimator的 Se tXxx()方法设置动画属性比如动画监听、持续时间、插值方式、重复次数等。
- 调用ValueAnimator的start()方法启动动画。
- 为ValueAnimator注册AnimatorUpdateListener监听器,在该监听器中可以监听ValueAnimator计算出来的值的改变,并将这些值应用到指定对象上。
ValueAnimator 使用
代码:
创建动画时可以参考上面动画的构建方法,测试代码中使用ofFolat方法实现值从0平滑过渡到1
/**
* ValueAnimator使用
*
* @param view
*/
public void valueAnimator(View view) {
animator = ValueAnimator.ofFloat(1f, 0f, 1f); //值从0平滑过渡到1
animator.setDuration(3000);//动画持续时间
// animator.setInterpolator(new OvershootInterpolator(5f));////使用插值器
animator.setInterpolator(new MyDecelerateAccelerateInterpolator());//使用自定义插值器
animator.setRepeatCount(1);//设置重复动画,重复1次,则实际播放2次
//设置重复模式:逆向重复
// animator.setRepeatMode(ValueAnimator.REVERSE);
//设置重复模式:重新开始
// animator.setRepeatMode(ValueAnimator.RESTART);
//监听动画每一帧的值,添加对值的监听,获取值
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//动画开始
Toast.makeText(AnimatorAnimatonActivity.this, "动画开始了", Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationEnd(Animator animation) {
//动画结束
Toast.makeText(AnimatorAnimatonActivity.this, "动画结束了", Toast.LENGTH_SHORT).show();
animation.cancel();
}
@Override
public void onAnimationCancel(Animator animation) {
//动画取消,不论动画如何结束,取消还是正常结束,都会回调onAnimationEnd
}
@Override
public void onAnimationRepeat(Animator animation) {
//动画重复
}
});
//监听动画每一帧的值,添加对值的监听,获取值
/*
该监听器负责更新对象的值
可以通过getAnimatedValue()方法来获取当前帧的值,并将计算出来的值应用到指定对象上。
*/
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float value = (float) valueAnimator.getAnimatedValue();
iv.setRotationY(rotate);
//打印
Log.i("TAG", "onAnimationUpdate: value = "
+ value);
}
});
animator.addPauseListener(new Animator.AnimatorPauseListener() {
@Override
public void onAnimationPause(Animator animation) {//通知动画暂停
}
@Override
public void onAnimationResume(Animator animation) {//通知动画得到恢复,之前被暂停
}
});
animator.start();
}
代码显示效果:
ObjectAnimator
概述
直接对任意对象的任意属性进行动画操作的。
ObjectAnimator工作机制
通过寻找特定属性的get和set方法,然后通过方法不断地对值进行改变,从而实现动画效果的。
父类
ValueAnimator。
构建动画的方法
1、ofFloat:设置动画过渡值为float类型的ObjectAnimator
构造并返回一个在浮点值之间进行动画的ObjectAnimator,比如参数为(0.5f,1.0f)
第一种ofFloat:
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
参数解析:
target:第一个参数用于指定这个动画要操作的是哪个控件
propertyName:第二个参数用于指定这个动画要操作这个控件的哪个属性,是一个字符串,ObjectAnimator会根据这个属性名拼一个set[属性名](setRotationY)方法,然后用反射调用,从而实现动画。
values:第三个参数是可变长参数,表示动画值的范围。通常设置两个以上。
常用的propertyName整理
| set[属性名/propertyName] | Discription |
|---|---|
| setRotationX(float rotationX) | 表示围绕 X 轴旋转,rotationX 表示旋转度数 |
| setRotationY(rotationY) | 表示围绕 Y 轴旋转,rotationY 表示旋转度数 |
| setRotation(float rotation) | 表示围绕 Z 旋转,rotation 表示旋转度数 |
| setTranslationX(float translationX) | 表示在 X 轴上的平移距离,以当前控件为原点,向右为正方向,参数 translationX 表示移动的距离。 |
| setTranslationY(float translationY) | 表示在 Y 轴上的平移距离,以当前控件为原点,向下为正方向,参数 translationY 表示移动的距离 |
| setScaleX(float scaleX) | 在 X 轴上缩放,scaleX 表示缩放倍数 |
| setScaleY(float scaleY) | 在 Y 轴上缩放,scaleY 表示缩放倍数 |
第二种ofFloat:
public static ObjectAnimator ofFloat(Object target, String xPropertyName, String yPropertyName,Path path)
参数解析:
xPropertyName:X 坐标正在进行动画处理的属性的名称
yPropertyName:y 坐标正在进行动画处理的属性的名称
path:动画的路径。相当于values,但是功能更强大,可以画出任意的图形,一般在矢量动画中经常用。后面会讲到。
第三种ofFloat:
public static <T> ObjectAnimator ofFloat(T target, Property<T, Float> property,
float... values)
参数说明:
property:正在进行动画处理的属性
第四种ofFloat:
public static <T> ObjectAnimator ofFloat(T target, Property<T, Float> xProperty,
Property<T, Float> yProperty, Path path)
参数说明:
xProperty:正在进行动画处理的属性的x坐标
yProperty:正在进行动画处理的属性的y坐标
2、ofInt:设置动画过渡值为int类型的ObjectAnimator
构造并返回一个在int值之间进行动画的ObjectAnimator,比如参数为(0,360).
参数说明参照ofFloat.
public static ObjectAnimator ofInt(Object target, String propertyName, int... values)
public static ObjectAnimator ofInt(Object target, String xPropertyName, String yPropertyName,
Path path)
public static <T> ObjectAnimator ofInt(T target, Property<T, Integer> property, int... values)
public static <T> ObjectAnimator ofInt(T target, Property<T, Integer> xProperty,
Property<T, Integer> yProperty, Path path)
3、ofObject:设置动画过渡值为float类型的ObjectAnimator
构造并返回一个在对象值之间进行动画的ObjectAnimator,evaluator为插值器,可以使用自带的,也可以自定义插值器。详细介绍看下面高级属性讲解。
参数说明参照ofFloat.
public static ObjectAnimator ofObject(Object target, String propertyName,
TypeEvaluator evaluator, Object... values)
参数说明:
evaluator:是自定义的 Evaluator;
values,可变参数长参数。
由上面源码可见,ofObject不能直接操作可见,可以在其addUpdateListener方法中操作,该方法通常适用于自定义View。
@NonNull
public static ObjectAnimator ofObject(Object target, String propertyName,
@Nullable TypeConverter<PointF, ?> converter, Path path)
@NonNull
@SafeVarargs
public static <T, V> ObjectAnimator ofObject(T target, Property<T, V> property,
TypeEvaluator<V> evaluator, V... values)
@NonNull
@SafeVarargs
public static <T, V, P> ObjectAnimator ofObject(T target, Property<T, P> property,
TypeConverter<V, P> converter, TypeEvaluator<V> evaluator, V... values)
@NonNull
public static <T, V> ObjectAnimator ofObject(T target, @NonNull Property<T, V> property,
@Nullable TypeConverter<PointF, V> converter, Path path)
4、ofArgb:设置动画过渡值为color类型的ObjectAnimator
构造并返回一个在颜色值值之间进行动画的ObjectAnimator.
参数说明参照ofFloat.
public static ObjectAnimator ofArgb(Object target, String propertyName, int... values)
public static <T> ObjectAnimator ofArgb(T target, Property<T, Integer> property,
int... values)
5、ofPropertyValuesHolder
在PropertyValuesHolder指定不同属性动画,同时操作多个不同属性的ObjectAnimator。
参数说明参照ofFloat.
@NonNull
public static ObjectAnimator ofPropertyValuesHolder(Object target,
PropertyValuesHolder... values)
6、ofMultiFloat
构造并返回一个对多个Float进行动画化的ObjectAnimator参数设置器只支持仅使用Float参数的公共方法。
参数说明参照ofFloat.
public static ObjectAnimator ofMultiFloat(Object target, String propertyName,
float[][] values)
参数说明:
values:一组动画会随着时间的推移动画之间的值。
public static ObjectAnimator ofMultiFloat(Object target, String propertyName, Path path)
public static <T> ObjectAnimator ofMultiFloat(Object target, String propertyName,
TypeConverter<T, float[]> converter, TypeEvaluator<T> evaluator, T... values)
参数说明:
converter:T 对象转换为多值二传手 float 参数
7、ofMultiInt
构造并返回一个对多个int进行动画化的ObjectAnimator参数设置器只支持仅使用int参数的公共方法。
参数说明参照上面参数说明.
public static ObjectAnimator ofMultiInt(Object target, String propertyName, int[][] values)
public static ObjectAnimator ofMultiInt(Object target, String propertyName, Path path)
@SafeVarargs
public static <T> ObjectAnimator ofMultiInt(Object target, String propertyName,
TypeConverter<T, int[]> converter, TypeEvaluator<T> evaluator, T... values)
ObjectAnimator 创建动画
ObjectAnimator 创建动画可以参考ValueAnimator创建动画的步骤,但不需要设置AnimatorUpdateListener监听器,即第四步不是必要的。因为ObjectAnimator继承了 ValueAnimator,因此它可以直接将ValueAnimator在动画过程中计算出来的值应用到指定对象的指定属性上(ValueAnimator则需要注册一个监听器来完成这个
工作)。因此使用ObjectAnimator就不需要注册AnimatorUpdateListener监听器了。
ObjectAnimator 使用
代码:
/**
* ObjectAnimator使用
*
* @param view
*/
public void ObjectAnimator(View view) {
// ObjectAnimator ofFloat(Object target, String propertyName, float... values)
/*
* 第一个参数:动画的控件
* 第二个参数:动画的属性名 任意的值 alpha、rotation、translationX、scaleY
* 第三个参数:可变参数,表示动画值的范围
* 其中属性名是一个字符串,ObjectAnimator会根据这个属性名拼一个set[属性名](setRotationY)方法,然后用反射调用,从而实现动画
*/
float curTranslationX = iv.getTranslationX();//获取到当前控件的translationX的位置
/*
* 第一个参数:动画的控件
* 第二个参数:
* 第三个参数:系统控件移动方向
* 第四个参数:
* 第五个参数:
*/
objectAnimator = ObjectAnimator.ofFloat(iv, "translationX", curTranslationX, -500f, curTranslationX);
objectAnimator.setDuration(3000);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
objectAnimator.start();
}
测试效果:
高级属性讲解
Evaluator
概述:
属性动画还需要利用一个 Evaluator (计算器),该工具类控制属性动画如何计算属性值。设置动画系统如何从初始值过度到结束值
使用:
ofObject()构建动画时传入第二个参数。
分类:
Android提供了如下Evaluator:
- IntEvaluator:计算int型的属性值插值
- FloatEvaluator:计算float型的属性值插值;
- ArgbEvaluator:计算颜色的属性值插值;
- TypeEvaluator: 它是计算器接口,开发者可以通过实现该接口来实现自定义计算器。 如 果 需 要 对 in、 float或
者Argb 以 外 类 型 的 属 性 执 行 属 性 动 画 , 可 能 需 要 实 现TypeEvaluator接口来实现自定义计算器。
Interpolator
概述:
插值器只是一个概念,系统中与之相关的类叫做 TimeInterpolator ,其只是一个接口,准确来说叫做“时间插值器”。
意思是:该时间插值器定义了动画的变化率,允许动画做非线性的运动,比如加速、减速。
Interpolator根据特定算法计算出整个动画所需要动态插入帧的密度和位置。简单地说,
Interpolator负责控制动画的变化速度,这就使得基本的动画效果 ( Alpha 、 Scale 、 Translate 、Rotate)能以匀速变化、加速、减速、抛物线速度等各种速度变化。
TimeInterpolator 是 一 个 接 口 , 它 定 义 了 所 有 Interpolator都 需要实现的方法 ,开发者完全可以通过实现Interpolator来控制动画的变化速度。
使用:
setInterpolator(TimeInterpolator value):设置插值器属性
分类:
Android为Interpolator提供了如下几个实现类,分别用于实现不同的动画变化速度
1、AccelerateDecelerateInterpolator开始与结束的地方速率改变比较慢,在中间的时候加速.
2、AccelerateInterpolator开始的地方速率改变比较慢,然后开始加速
3、AnticipateInterpolator开始的时候向后然后向前甩
4、AnticipateOvershootInterpolator开始的时候向后然后向前甩一定值后返回最后的值
5、BounceInterpolator动画结束的时候弹起
6、CycleInterpolator循环播放特定的次数,速率改变沿着正弦曲线
7、DecelerateInterpolator在开始的地方快然后慢
创建的时候,也可以传递float类型值,如DecelerateInterpolator(2f):
8、 LinearInterpolator以常量速率改变
9、OvershootInterpolator向前甩一定值后再回到原来位置
创建的时候,也可以传递float类型值,OvershootInterpolator(0.8f):
10、自定义TimeInterpolator
PropertyValuesHolder()
概述:
PropertyValuesHolder 可以被 ValueAnimator 或 ObjectAnimator用来创建动画,以同时操作多个不同属性。
PropertyValuesHolder 这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。通过 ofFloat(Object target, String propertyName, float… values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成 PropertyValuesHolder 实例来保存动画状态。在封装成 PropertyValuesHolder 实例以后,后期的各种操作也是以 PropertyValuesHolder 为主的
Keyframe
Keyframe用来保存一对时间/变量的动画值
public static Keyframe ofFloat(float fraction, float value)
其中:
fraction:表示当前的显示进度,即从加速器中 getInterpolation()函数的返回值;
value:表示当前应该在的位置 比如 Keyframe.ofFloat(0, 0)表示动画进度为 0 时,动画所在的数值位置为 0;Keyframe.ofFloat(0.25f, -20f)表示动画进度为 25%时,动画所在的数值位置为-20;Keyframe.ofFloat(1f,0)表示动画结束时,动画所在的数值位置为 0
源码:
public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)
其中:
target:指需要执行动画的控件
values:是一个可变长参数,可以传进去多个 PropertyValuesHolder 实例,由于每个 PropertyValuesHolder 实例都会针对一个属性做动画,所以如果传进去多个 PropertyValuesHolder 实例,将会对控件的多个属性同时做动画操作。
public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)
其中
propertyName:动画所要操作的属性名
values:Keyframe 的列表,PropertyValuesHolder 会根据每个 Keyframe 的设定,定时将指定的值输出给动画。
示例代码:
/*
PropertyValuesHolders使用
*/
public void PropertyValuesHolder(View view) {
/*
一个ObjectAnimator
*/
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(iv, pvhX, pvhY).start();
}
public void Keyframe(View view) {
//keyframe
Keyframe keyframe1 = Keyframe.ofFloat(0.0f,0);
Keyframe keyframe2 = Keyframe.ofFloat(0.25f,-30);
Keyframe keyframe3 = Keyframe.ofFloat(0.5f,0);
Keyframe keyframe4 = Keyframe.ofFloat(0.75f, 30);
Keyframe keyframe5 = Keyframe.ofFloat(1.0f,0);
PropertyValuesHolder rotation = PropertyValuesHolder.ofKeyframe("rotation", keyframe1, keyframe2, keyframe3, keyframe4,keyframe5);
PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha",1.0f,0.2f,1.0f);
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX",1.0f,0.2f,1.0f);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY",1.0f,0.2f,1.0f);
PropertyValuesHolder color = PropertyValuesHolder.ofInt("BackgroundColor", 0XFFFFFF00, 0XFF0000FF);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(iv, alpha, scaleX, scaleY,color,rotation);
animator.setInterpolator(new OvershootInterpolator());
animator.setDuration(5000).start();
}
示例效果:
ViewPropertyAnimator
概述:
ViewPropertyAnimator 提供了一种并行属性动画的简单方法,在3.1系统当中附增的一个新的功能,是Android开发团队为View的动画操作提供一种更加便捷的用法3.1系统当中附增的一个新的功能,对View进行动画操作的类。
优点:
可以操作View对象(只能作用于View而不能作用于其他object )。
将多个动画组合到一起,多个属性动画是一次同时变化,只执行一次UI刷新
支持连缀用法的。
ViewPropertyAnimator的常用方法:
| Method | Discription |
|---|---|
| alpha(float value) | 设置透明度,value表示变化到多少,1不透明,0全透明。 |
| scaleY(float value) | 设置Y轴方向的缩放大小,value表示缩放到多少。1表示正常规格。小于1代表缩小,大于1代表放大。 |
| scaleX(float value) | 设置X轴方向的缩放大小,value表示缩放到多少。1表示正常规格。小于1代表缩小,大于1代表放大。 |
| translationY(float value) | 设置Y轴方向的移动值,作为增量来控制View对象相对于它父容器的左上角坐标偏移的位置,即移动到哪里。 |
| translationX(float value) | 设置X轴方向的移动值,作为增量来控制View对象相对于它父容器的左上角坐标偏移的位置。 |
| rotation(float value) | 控制View对象围绕支点进行旋转, rotation针对2D旋转 |
| rotationX (float value) | 控制View对象围绕X支点进行旋转, rotationX针对3D旋转 |
| rotationY(float value) | 控制View对象围绕Y支点进行旋转, rotationY针对3D旋转 |
| x(float value) | 控制View对象相对于它父容器的左上角坐标在X轴方向的最终位置。 |
| y(float value) | 控制View对象相对于它父容器的左上角坐标在Y轴方向的最终位置 |
| void cancel() | 取消当前正在执行的动画 |
| setListener(Animator.AnimatorListener listener) | 设置监听器,监听动画的开始,结束,取消,重复播放 |
| setUpdateListener(ValueAnimator.AnimatorUpdateListener listener) | 设置监听器,监听动画的每一帧的播放 |
| setInterpolator(TimeInterpolator interpolator) | 设置插值器 |
| setStartDelay(long startDelay) | 设置动画延长开始的时间 |
| setDuration(long duration) | 设置动画执行的时间 |
| withLayer() | 设置是否开启硬件加速 |
| withStartAction(Runnable runnable) | 设置用于动画监听开始(Animator.AnimatorListener)时运行的Runnable任务对象 |
| withEndAction(Runnable runnable) | 设置用于动画监听结束(Animator.AnimatorListener)时运行的Runnable任务对象 |
示例代码:
/*
ViewPropertyAnimator使用
*/
public void ViewPropertyAnimator(View view) {//控件移动到(0,0)
iv.animate().x(0).y(0).setDuration(5000)
.setInterpolator(new BounceInterpolator());
}
示例效果:
总结
属性动画的本质原理:通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。虽然属性动画已经非常强大,但是要想对一些复杂的图形进行动画操作,还是有点难度的,矢量动画可以解决这个难点因为前面的动画都是对控件或者View做动画,而矢量动画是对图形做动画。请继续关注下一篇属性动画实现Tween功能和高级属性实例。
写博客是为了帮助开发者学习使用技术,同时巩固自己所学技术。如果此篇博客有助于您的学习,那是我的荣幸!如果此篇博客有任何瑕疵,请多多指教!在此感谢您的学习和指教!
本文详细介绍了Android属性动画的机制、API及基本使用,包括ValueAnimator、ObjectAnimator、AnimatorSet和PropertyValuesHolder的用法。通过实例演示了如何创建和使用属性动画,强调了属性动画对任意对象属性的控制能力,以及与补间动画的区别。最后讨论了Evaluator、Interpolator和ViewPropertyAnimator等高级特性,揭示了属性动画实现动画效果的本质。
1798

被折叠的 条评论
为什么被折叠?



