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

本文详细介绍了Android属性动画系统,包括ValueAnimator、ObjectAnimator和AnimatorSet等核心类的使用方法及插值器的效果展示。

介绍

属性动画是在API 11加入的新特性,它对原来的View动画做了很大的增强。它的API 主要都放在android.animation下,如图:
这里写图片描述

这其中比较重要的有:

介绍
ValueAnimator它是改变值,然后通过这个值去改变对象的属性值,从而达到动画效果
ObjectAnimatorValueAnimator的子类,它是直接作用于对象,改变对象的属性值。
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);

这里写图片描述

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值