Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。
补间动画的缺陷:
1、补间动画只能够作用在View上;
2、补间动画只能够实现移动、缩放、旋转和淡入淡出这四种动画操作;
3、补间动画只是改变了View的显示效果而已,而不会真正去改变View的属性。
属性动画机制实际上是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。
使用Java代码定义属性动画
ValueAnimator
属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。
示例演示
// 获取ValueAnimator实例
// 0f, 5f, 3f, 10f为给定的值
ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);
// 设置动画持续时间
anim.setDuration(300);
// 添加监听器
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取当前值
float currentValue = (float) animation.getAnimatedValue();
Log.d(TAG, "currentValue: " + currentValue);
}
});
anim.start();
运行结果
D/MainActivity: currentValue: 0.0
D/MainActivity: currentValue: 0.11853263
D/MainActivity: currentValue: 1.7715302
D/MainActivity: currentValue: 2.659067
D/MainActivity: currentValue: 3.818223
D/MainActivity: currentValue: 4.9866004
D/MainActivity: currentValue: 4.469303
D/MainActivity: currentValue: 3.9685845
D/MainActivity: currentValue: 3.365308
D/MainActivity: currentValue: 10.0
ValueAnimator的常用方法:
1)ValueAnimator.ofFloat()方法:添入float类型的值
2)ValueAnimator.ofInt()方法:添入int类型的值
3)ValueAnimator.ofObject()方法:添入Object对象
4)anim.setStartDelay()方法:设置动画延迟播放的时间
5)anim.setRepeatCount()方法:设置动画循环播放的次数
6)anim.setRepeatMode()方法:设置动画循环播放的模式,循环模式(RESTART:重新播放、REVERSE:倒序播放)
ObjectAnimator
ObjectAnimator继承自ValueAnimator它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。
1)淡入淡出
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
animator.setDuration(5000);
animator.start();
2)旋转
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
animator.setDuration(5000);
animator.start();
3)移动
float curTranslationX = textview.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX",
curTranslationX, -500f, curTranslationX);
animator.setDuration(5000);
animator.start();
4)缩放
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);
animator.setDuration(5000);
animator.start();
AnimatorSet
实现组合动画功能主要需要借助AnimatorSet这个类。
1)play(Animator anim)方法:播放动画
2)after(Animator anim)方法:将现有动画插入到传入的动画之后执行
3)after(long delay)方法:将现有动画延迟指定毫秒后执行
4)before(Animator anim)方法:将现有动画插入到传入的动画之前执行
5)with(Animator anim)方法:将现有动画和传入的动画同时执行
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
Animator监听器
1)AnimatorListener
anim.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) {
}
});
2)AnimatorListenerAdapter
anim.addListener(new AnimatorListenerAdapter() {
// 在动画结束的时候调用
@Override
public void onAnimationEnd(Animator animation) {
}
});
使用XML定义属性动画
如果想要使用XML来编写动画,要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。
在XML文件中一共可以使用如下三种标签:
<animator> 对应代码中的ValueAnimator
<objectAnimator>对应代码中的ObjectAnimator
<set>对应代码中的AnimatorSet
编写
res/animator/anim_file
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0"
android:valueTo="100"
android:valueType="intType"/>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType"
android:propertyName="alpha"/>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="-500"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="together" >
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="sequentially" >
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" >
</objectAnimator>
</set>
</set>
</set>
使用
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
网友评论