Android学习笔记(九)| Android动画(下)—— 属

2019-02-25  本文已影响0人  CCCode1997

参考书籍:《Android开发艺术探索》 任玉刚
如有错漏,请批评指出!

属性动画是API 11 新加入的特性,不同于View动画只能作用于View,它可以对任意对象做动画操作。比较常用的几个动画类有 ValueAnimator、ObjectAnimator、AnimatorSet,想要兼容API 11 以前的Android版本,我们可以使用开源动画库 nineoldandroids,这里就不去探讨它的使用方法了,下面我们来看属性动画的用法。

属性动画的用法

属性动画可以对任意对象的属性进行动画而不仅仅是View,动画默认时间是300ms,默认帧率是 10ms/帧。先来看看ValueAnimator 和 ObjectAnimator 这两个类:

ValueAnimator

ValueAnimator 这个类本身不作用于任何对象,它是在一定时间内对一个值进行平滑过渡,因此,我们要使用它来实现动画,就需要监听这个过渡过程,获取过渡值,利用这个过渡值来对实际的对象进行处理(可能不太好理解)。下面来看看代码:

ValueAnimator animator = ValueAnimator.ofFloat(1.0f, 1000.0f);
animator.setDuration(100);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        Log.e("code", animation.getAnimatedValue()+"");
    }
});
animator.start();
先来看打印结果:

可以看到,这里实现的是在100ms内将一个数从1.0变为1000.0,每一帧(即每更新一次数值)会回调一次 onAnimationUpdate() 方法,在这个方法中,我们可以通过传入的 ValueAnimation 对象的 getAnimatedValue() 方法获取这个值,利用这个值来实现动画效果。

当然,还有更简单的方法,我们重点来看 ObjectAnimator 类。

ObjectAnimator

ObjectAnimator 类 是继承自 ValueAnimator 类的,它主要重写了 ValueAnimator 的几个 ofXXX() 方法,让动画与对象直接相关联,这样我们就不需要自己来监听动画过程,控制动画效果了。下面来看几个示例:
注:下面的代码中涉及到一些基本属性,在 Android学习笔记(七)| Android动画(上)—— View动画 中已经讲过,没看过的话,建议移步。

AnimatorSet

AnimatorSet 是动画集合,也就是同时播放一组动画。

    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playTogether(
        ObjectAnimator.ofFloat(tvObjAnim, "translationX", 0.0f, 200.0f), 
        ObjectAnimator.ofFloat(tvRotate, "rotationX", 0, 180),
        ObjectAnimator.ofFloat(tvScale, "scaleX", 1.0f, 2.0f),
        ObjectAnimator.ofFloat(tvAlpha, "alpha", 1, 0)
    );
    animatorSet.setDuration(1000);
    animatorSet.start();

想要让动画循环播放的话,还是需要给每个ObjectAnimator单独指定相关属性。

上面这些效果都可以通过 xml 来定义,在前面的文章也讲过xml定义,只是标签不同,这里就不赘述了。

插值器 和 估值器 的概念

属性动画的监听器

属性动画提供了监听器用于监听动画的播放过程,主要有两个接口:AnimatorUpdateListener 和 AnimatorListener。

    public static interface AnimatorListener {
        default void onAnimationStart(Animator animation, boolean isReverse) {
            onAnimationStart(animation);
        }

        default void onAnimationEnd(Animator animation, boolean isReverse) {
            onAnimationEnd(animation);
        }

        void onAnimationStart(Animator animation);

        void onAnimationEnd(Animator animation);

        void onAnimationCancel(Animator animation);

        void onAnimationRepeat(Animator animation);
    }

可以看到,AnimatorListener 可以监听动画的开始、结束、取消以及重复播放。

    public static interface AnimatorUpdateListener {
        /**
         * <p>Notifies the occurrence of another frame of the animation.</p>
         *
         * @param animation The animation which was repeated.
         */
        void onAnimationUpdate(ValueAnimator animation);
    }

这个接口会监听动画的整个过程,前面说过动画是由许多帧组成的,也就是说,每播放一帧,onAnimationUpdate() 方法就会被调用一次。


上一篇:Android学习笔记(八)| Android动画(中)—— 帧动画
下一篇:Android学习笔记(十)| Drawable的基本用法

上一篇 下一篇

猜你喜欢

热点阅读