一. 属性动画出现的原因
传统动画局限性:
- 作用对象局限:View
- 没有改变View的属性,只是改变视觉效果
- 动画效果单一,可扩展性有较大局限性
为了解决补间动画的缺陷,在 Android 3.0(API 11)开始,系统提供了一种全新的动画模式:属性动画(Property Animation)
二. 作用对象
任意java对象和属性
三. 原理
在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。
可是任意对象,任意属性
四. 分类
- ValueAnimator
- ObjectAnimator
- ViewPropertyAnimator(动画简写)
- 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)