概述
1.在3.0系统之后,一共出现了三种动画,帧动画、补间动画和属性动画。
- 帧动画:是将一个完整的动画拆分成一张张图片,然后将他们按顺序排列连贯播放;
- 补间动画(Animation):专门为view设置的动画,可以设置有透明、旋转、缩放、位移效果;
缺点:只能给view设置动画,非view动画不能设置动画;并且只改变了view的动画效果并没有改变自身的位置; - 属性动画(Animator):可以实现补间动画的全部功能,也能改变对象本身的属性;
ObjectAnimator
ObjectAnimator是属性动画中最常用的一个类,可以通过它直接控制动画的属性。
执行单个动画:
ObjectAnimator.ofFloat(image, "translationX", 0f, 500f) // 初始化动画,设置各个参数
.setDuration(3000) // 设置动画持续时间
.start(); // 开始运行动画
多个动画一起执行(一):
ObjectAnimator.ofFloat(image, "translationX", 0f, 500f).setDuration(3000).start();
ObjectAnimator.ofFloat(image, "translationY", 0f, 500f).setDuration(3000).start();
ObjectAnimator.ofFloat(image, "rotation", 0f, 360f).setDuration(3000).start();
多个动画一起执行(二):
ObjectAnimator animator1 = ObjectAnimator.ofFloat(image, "translationX", 0f, 500f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(image, "translationY", 0f, 500f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(image, "rotation", 0f, 360f);
AnimatorSet set = new AnimatorSet();
set.setDuration(3000);
set.playTogether(animator1, animator2, animator3);
set.start();
多个动画可以按先后顺序执行(一):
ObjectAnimator animator1 = ObjectAnimator.ofFloat(image, "translationX", 0f, 500f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(image, "translationY", 0f, 500f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(image, "rotationX", 0f, 360f);
ObjectAnimator animator4 = ObjectAnimator.ofFloat(image, "rotationY", 0f, 360f);
AnimatorSet set = new AnimatorSet();
set.play(animator3).before(animator2).after(animator1).with(animator4);
set.setDuration(3000);
set.start();
多个动画可以按先后顺序执行(二):
设置监听AnimatorListener
ObjectAnimator animator1 = ObjectAnimator.ofFloat(image, "alpha", 0f, 1f);
final ObjectAnimator animator2 = ObjectAnimator.ofFloat(image, "translationX", 0f, 500f);
final ObjectAnimator animator3 = ObjectAnimator.ofFloat(image, "translationY", 0f, 500f);
animator1.setDuration(3000);
animator2.setDuration(3000);
animator3.setDuration(3000);
// 设置属性动画的监听事件(使用AnimatorListener必须要监听所有四个事件)
animator1.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
animator2.start();
}
@Override
public void onAnimationEnd(Animator animation) {
animator3.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator1.start();
多个动画可以按先后顺序执行(三):
设置监听AnimatorListenerAdapter
// 设置属性动画的监听事件(使用AnimatorListenerAdapter可以选择不监听所有事件)
animator1.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
animator3.start(); // 在animator1执行完后执行animator3
}
@Override
public void onAnimationStart(Animator animation) {
animator2.start(); //在animator1执行的同时执行animator2
}
});
animator1.start();
ValueAnimator
ValueAnimator是整个属性动画最核心的类,ObjectAnimator是ValueAnimator的子类,ValueAnimator负责改变对象的属性值通过不断计算来改变的,ValueAnimator还负责管理动画的播放次数、播放模式和动画监听等。
ValueAnimator的监听:
ValueAnimator还可以通过setRepeatCount()和setRepeatMode()方法来设置动画重复的次数和播放模式、通过setStartDelay()方法来设置动画延迟播放的时间
ValueAnimator animator = ValueAnimator.ofInt(0, 100); // 产生一个从0到100变化的整数的动画
animator.setDuration(2000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue(); // 动态的获取当前运行到的属性值
((Button) view).setText(value + "");
}
});
animator.start(); // 开始播放动画
在XML中编写动画
在这里面编写动画的话可以实现动画的重用;
在项目的res目录下创建一个名为animator的文件夹,在这个文件夹中定义动画。animator动画XML文件中可以包括以下三种标签:
- :相当于JAVA代码中的ValueAnimator;
- :相当于JAVA代码中的ObjectAnimator;
- :相当于JAVA代码中的AnimatorSet。
定义ValueAnimator:
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:interpolator="@android:anim/bounce_interpolator"
android:repeatCount="2"
android:repeatMode="restart"
android:valueFrom="0"
android:valueTo="100"
android:valueType="intType" />
定义ObjectAnimator:
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:interpolator="@android:anim/accelerate_interpolator"
android:propertyName="scaleX"
android:repeatCount="2"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" />
动画组合:
?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:duration="5000"
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="500"
android:valueType="floatType" />
<objectAnimator
android:duration="5000"
android:propertyName="translationY"
android:valueFrom="0"
android:valueTo="500"
android:valueType="floatType" />
<set android:ordering="together">
<objectAnimator
android:duration="5000"
android:propertyName="scaleX"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" />
<objectAnimator
android:duration="5000"
android:propertyName="scaleY"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" />
</set>
</set>
代码调用方法:
Animator animator = AnimatorInflater.loadAnimator(MainActivity.this,R.animator.object_animator);
animator.setTarget(view);
animator.start();
Interpolator
nterpolator的作用是可以控制动画的变化速率
,常用API:
1) BounceInterpolator:弹跳效果;
2) AccelerateInterpolator:逐渐加速;
3) DecelerateInterpolator:逐渐减速;
4) AccelerateDecelerateInterpolator:先加速后减速;
5) OvershootInterpolator:到达目标点时“跑过头了”,再返回到目标点;
6) AnticipateInterpolator:移动之前先向后“助跑”;
7) AnticipateOvershootInterpolator:OvershootInterpolator和AnticipateInterpolator的组合效果;
8) CycleInterpolator:对于指定的动画,正向做一遍,反响做一遍;
Android中还为我们提供了一个接口TimeInterpolator,供我们自定义插值器。我们也可以实现TimeInterpolator的一些已有实现类(如BaseInterpolator、Interpolator)来自定义插值器。
TimeInterpolator接口中又一个抽象方法setInterpolation(),方法中又一个参数input,这个参数的值在整个动画过程中从0匀速变化到1,也就是相当于一个百分比,指示当前动画播放到哪了。
ViewPropertyAnimator
ViewPropertyAnimator让我们可以使用链式编程,一行代码为一个View对象设置属性,示例代码如下:
textView.animate()
.translationX(200)
.translationY(200)
.setDuration(2000)
.setInterpolator(new BounceInterpolator())
.start();