Android 动画使用总结(一)属性动画
介绍
属性动画是在API 11加入的新特性,它对原来的View动画做了很大的增强。它的API 主要都放在android.animation下,如图:
这其中比较重要的有:
类 | 介绍 |
---|---|
ValueAnimator | 它是改变值,然后通过这个值去改变对象的属性值,从而达到动画效果 |
ObjectAnimator | ValueAnimator的子类,它是直接作用于对象,改变对象的属性值。 |
AnimatorSet | 把多个动画组合到一起,可以控制这些动画的执行先后顺序已经执行方式。 |
ValueAnimator的使用方法
ValueAnimator的创建方法有ofInt(), ofFloat(),ofArgb(), ofObject()可以根据需要选择不同的创建方法。下面通过ValueAnimator让Button向右移动。
- 创建动画
ValueAnimator animation = ValueAnimator.ofInt(0, 1000);
//设置动画执行时间
animation.setDuration(5000);
animation.start();
- 设置监听
animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator updatedAnimation) {
float animatedValue = (float)updatedAnimation.getAnimatedValue();
button.setTranslationX(animatedValue);
}
});
在onAnimationUpdate()方法中拿到动画改变的值,然后通过这个值去改变Button的属性值。
ObjectAnimator的使用方法
ObjectAnimator是ValueAnimator的子类,它可以直接修改目标对象的属性值,用它啊可以使动画变得更简单,不再需要去设置动画监听animation.addUpdateListener().
它的使用方式和ValueAnimator类似,只是需要指定一个目标对象和目标属性,比如:
ObjectAnimator animation = ObjectAnimator.ofFloat(textView, "translationX", 100f);
animation.setDuration(1000);
animation.start();
需要注意的是这里的目标属性虽然可以任意指定但也有一个条件,那就是这个属性在目标对象中一定要存在set(),因为ObjectAnimator是在动画期间自动更新属性值。如果目标对象没有这个setter方法,可以通过下面这三种方式去达到使用属性动画的目的:
- 直接在类中增加get set方法
- 改用ValueAnimator
- 为当前对象增加一个包裹类,在包裹类的get set方法中去设置
第一和第二种方式都有一定的局限性,看下第三种方式的实现方式。这里用ObjectAnimator动画改变Button的宽度,通过源码可以看到Button类中并没有setWidth()这个方法。
AnimatorSet的使用方法
在很多时候动画之间都需要一定的执行顺序,比如动画B要在动画A执行完之后再执行,或者动画A和动画B要一起执行。这个时候就需要用到AnimatorSet,它的目的就是把多个动画集合到一起来执行。
使用示例,有两个动画分别是translationXAnimator、translationYAnimator将目标对象向X轴和Y轴移动。
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "translationX", 200f);
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView, "translationY", 200f);
AnimatorSet animatorSet = new AnimatorSet();
同时移动
animatorSet.play(scaleXAnimator).with(scaleYAnimator);
//或者
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
先后执行
animatorSet.play(scaleXAnimator).before(scaleYAnimator);
Interpolators(插值器)
类或接口 | 功能 |
---|---|
AccelerateDecelerateInterpolator | 动画开始和结束的时候比较慢,中间快 |
AccelerateInterpolator | 动画开始的时候比较慢,然后开始加速 |
AnticipateInterpolator | 开始向后后,然后向前,类似回弹效果 |
AnticipateOvershootInterpolator | 开始向后,然后向前以直超过终点值,然后弹回 |
BounceInterpolator | 在结束的时候弹起 |
CycleInterpolator | 循环一定次数 |
DecelerateInterpolator | 开始的时候快,然后减速 |
LinearInterpolator | 以常量固定速率运行 |
OvershootInterpolator | 向前一定距离,然后弹回 |
TimeInterpolator | 一个接口,允许实现自己的插值器 |
插值器的使用很简单,比如:
scaleXAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
通过移动对象的水平位置来看下各个插值器的简单效果。
AccelerateDecelerateInterpolator
AccelerateInterpolator
//开始慢,逐渐加快
scaleXAnimator.setInterpolator(new AccelerateInterpolator());
AnticipateInterpolator
//开始向后一点
scaleXAnimator.setInterpolator(new AnticipateInterpolator());
AnticipateOvershootInterpolator
//两边回弹
scaleXAnimator.setInterpolator(new AnticipateOvershootInterpolator());
BounceInterpolator
//结束的时候有弹性
scaleXAnimator.setInterpolator(new BounceInterpolator());
CycleInterpolator
//循环一定次数
scaleXAnimator.setInterpolator(new CycleInterpolator(3));
TimeInterpolator 自定义插值器
class MyTimeInterpolator implements TimeInterpolator{
@Override
public float getInterpolation(float input) {
return (float)(Math.cos((input+1) * Math.PI) / 2.0f) + 0.5f;
}
}
关于插值器的各种效果,可以参考一下这个网站:
http://inloop.github.io/interpolator/
总结
ValueAnimator是改变值,通过监听值的改变去实现动画,使用比较复杂,但没有局限性。
ObjectAnimator直接为设置对象做动画,但动画的属性值必须有get、set方法,若没有可以在目标对象外在包裹一层。
上一篇: Flutter 自定义底部导航条及切换