欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 动画使用总结(一)属性动画

程序员文章站 2024-03-21 11:22:58
...

介绍

属性动画是在API 11加入的新特性,它对原来的View动画做了很大的增强。它的API 主要都放在android.animation下,如图:
Android 动画使用总结(一)属性动画

这其中比较重要的有:

介绍
ValueAnimator 它是改变值,然后通过这个值去改变对象的属性值,从而达到动画效果
ObjectAnimator ValueAnimator的子类,它是直接作用于对象,改变对象的属性值。
AnimatorSet 把多个动画组合到一起,可以控制这些动画的执行先后顺序已经执行方式。

ValueAnimator的使用方法

ValueAnimator的创建方法有ofInt(), ofFloat(),ofArgb(), ofObject()可以根据需要选择不同的创建方法。下面通过ValueAnimator让Button向右移动。

  1. 创建动画
 ValueAnimator animation = ValueAnimator.ofInt(0, 1000);
 //设置动画执行时间
 animation.setDuration(5000);
 animation.start();
  1. 设置监听
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);

Android 动画使用总结(一)属性动画

先后执行
animatorSet.play(scaleXAnimator).before(scaleYAnimator);

Android 动画使用总结(一)属性动画

Interpolators(插值器)

类或接口 功能
AccelerateDecelerateInterpolator 动画开始和结束的时候比较慢,中间快
AccelerateInterpolator 动画开始的时候比较慢,然后开始加速
AnticipateInterpolator 开始向后后,然后向前,类似回弹效果
AnticipateOvershootInterpolator 开始向后,然后向前以直超过终点值,然后弹回
BounceInterpolator 在结束的时候弹起
CycleInterpolator 循环一定次数
DecelerateInterpolator 开始的时候快,然后减速
LinearInterpolator 以常量固定速率运行
OvershootInterpolator 向前一定距离,然后弹回
TimeInterpolator 一个接口,允许实现自己的插值器

插值器的使用很简单,比如:

scaleXAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

通过移动对象的水平位置来看下各个插值器的简单效果。

AccelerateDecelerateInterpolator

Android 动画使用总结(一)属性动画

AccelerateInterpolator
//开始慢,逐渐加快
scaleXAnimator.setInterpolator(new AccelerateInterpolator());

Android 动画使用总结(一)属性动画

AnticipateInterpolator
//开始向后一点
scaleXAnimator.setInterpolator(new AnticipateInterpolator());

Android 动画使用总结(一)属性动画

AnticipateOvershootInterpolator
//两边回弹
scaleXAnimator.setInterpolator(new AnticipateOvershootInterpolator());

Android 动画使用总结(一)属性动画

BounceInterpolator
//结束的时候有弹性
scaleXAnimator.setInterpolator(new BounceInterpolator());

Android 动画使用总结(一)属性动画

CycleInterpolator
//循环一定次数
scaleXAnimator.setInterpolator(new CycleInterpolator(3));

Android 动画使用总结(一)属性动画

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方法,若没有可以在目标对象外在包裹一层。