Android Animations

作者: 越小河流域 | 来源:发表于2016-05-02 21:59 被阅读444次
Android Animation

1 Android动画有哪些

Android 平台提供了一套完整的动画框架。

在Android3.0之前有两种动画,一种方式是补间动画 Tween Animation、另一种叫逐帧动画 Frame Animation(也称Drawable Animation )。

Tween Animation、Frame Animation只能用于View,被归类为View Animation。

Android3.0以后增加了属性动画Property Animation。这样子动画就分成两部分:


Google Android Docs - Animation

2 View Animation

2.1 Tween Animation

TweenAnimation只能应用于View对象,而且只支持一部分属性,如支持缩放旋转而不支持背景颜色的改变。而且对于TweenAnimation,并不改变属性的值,它只是改变了View对象绘制的位置,而没有改变View对象本身,比如,你有一个Button,坐标(100,100),Width:100,Height:100,而你有一个动画使其移动(200,200),你会发现动画过程中触发按钮点击的区域仍是(100,100)-(200,200)。

2.1.1 定义Tween Animation

View Animation就是一系列View形状的变换,如大小的缩放,透明度的改变,位置的改变,动画的定义既可以用代码定义也可以用XML定义,当然,建议用XML定义。在XML定义的资源,在Android Studio可以用Instant Run快速调试。

可以给一个View同时设置多个动画,比如从透明至不透明的淡入效果,与从小到大的放大效果,这些动画可以同时进行,也可以在一个完成之后开始另一个。

用XML定义的动画放在/res/anim/文件夹内,XML文件的根元素可以为alpha, scale, translate, rotate, interpolator元素或set(表示以上几个动画的集合,set可以嵌套)。
默认情况下,所有动画是同时进行的,可以通过startOffset属性设置各个动画的开始偏移(开始时间)来达到动画顺序播放的效果。

Tween Animation XML示例

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">    
<scale
            android:fromXScale="1.0"
            android:toXScale="2"
            android:fromYScale="1.0"
            android:toYScale="2"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="2000"
            />    

<translate
            android:duration="2000"
            android:fromXDelta="0.0%p"
            android:fromYDelta="0.0%p"
            android:toXDelta="50.0%p"
            android:toYDelta="50.0%p"
            />

<alpha
            android:fromAlpha="0.5"
            android:toAlpha="1.0"
            android:startOffset="500"
            android:duration="2000"
            />    

<rotate
            android:fromDegrees="0"
            android:toDegrees="720"
            android:pivotX="25"
            android:pivotY="25"
            android:duration="2000"
            />
</set>

注意:
android:pivotXandroid:pivotYandroid:fromXDelta,android:toXDelta
android:pivotX="50"使用绝对坐标
android:pivotX="50%"相对自己,自己的坐标也是固定的,不会随着位移动画变化。因为Tween动画的View在原处,动画效果是例外生成的图像。
android:pivotX="50%p"相对父控件

2.1.2 运行Tween动画

ivTween = (ImageView) getView().findViewById(R.id.iv_bat_man);
final Animation animation = AnimationUtils.loadAnimation(mActivity,R.anim.test_animation_tween);
ivTween.startAnimation(animation);  

2.1.3 TimeInterplator(时间插值器)

Time interplator定义了属性值变化的方式,如线性均匀改变,开始慢然后逐渐快等。在Property Animation中是TimeInterplator,在View Animation中是Interplator,这两个是一样的,在3.0之前只有Interplator,3.0之后实现代码转移至了TimeInterplator。Interplator继承自TimeInterplator,内部没有任何其他代码。

插值器 描述
AccelerateInterpolator 加速,开始时慢中间加速
DecelerateInterpolator 减速,开始时快然后减速
AccelerateDecelerateInterolator 先加速后减速,开始结束时慢,中间加速
AnticipateInterpolator 反向 ,先向相反方向改变一段再加速播放
AnticipateOvershootInterpolator 反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)
LinearInterpolator 线性,线性均匀改变
OvershottInterpolator 回弹,最后超出目的值然后缓慢改变到目的值
TimeInterpolator 一个接口,允许你自定义interpolator,以上几个都是实现了这个接口

2.2 Frame Animation

Drawable Animation(Frame Animation):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。

Java类AnimationDrawable继承于DrawableContainer,DrawableContainer继承于Drawable

2.2.1 Frame Animation的XML定义

在XML中的定义方式如下:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/loading01" android:duration="200" />
    <item android:drawable="@drawable/loading02" android:duration="200" />
    <item android:drawable="@drawable/loading03" android:duration="200" />
</animation-list>

必须以animation-list为根元素,以item表示要轮换显示的图片,duration属性表示各项显示的时间。XML文件要放在/res/drawable/目录下。示例:

2.2.2 调用示例

ivDrawable = (ImageView) getView().findViewById(R.id.iv_anim_drawable);
ivDrawable.setBackgroundResource(R.drawable.test_animation_drawable);

AnimationDrawable animationDrawable = (AnimationDrawable) ivDrawable.getBackground();
animationDrawable.start();

3 Property Animation(属性动画)

属性动画,这个是在Android 3.0中才引进的。

Property Animation可以定义在xml文件中,它用来在设定的时间内修改对象的属性。例如背景颜色和alpha的值。它更改的是对象的实际属性
在View Animation(Tween Animation)中,其改变的是View的绘制效果,真正的View的属性保持不变,比如无论你在对话中如何缩放Button的大小,Button的有效点击区域还是没有应用动画时的区域,其位置与大小都不变。
而在Property Animation中,改变的是对象的实际属性,如Button的缩放,Button的位置与大小属性值都改变了。而且Property Animation不止可以应用于View,还可以应用于任何对象。Property Animation只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。

3.1 Property Animation 动画的设置

The property animation system允许开发者定义动画设置:

  1. Duration: 动画间隔,默认300ms

  2. Time interpolation: 插值器
    默认线性插值器


    3.1-1 线性匀速动画 - Example of a linear animation

    非线性插值器(中间快前后慢)


    3.1-2 非线性动画
  3. Repeat count and behavior: 重复次数,反向or正向重复

  4. Animator sets: 动画集,可以一起播放动画,或者分开播放,或者延迟播放。

  5. Frame refresh delay: Frame刷新时间,默认10ms,但是实际刷新时间是由系统资源决定。

3.2 属性动画的实现

How animations are calculated

ValueAnimator

ValueAnimator对象跟踪动画时间,例如,动画已经运行多久,当前属性值是多少;

封装一个TimeInterpolator插值器;

TypeEvaluator定义当前的属性如何计算。

例如,图3.1-2的动画,theTimeInterpolatorused would be AccelerateDecelerateInterpolatorand theTypeEvaluator would beIntEvaluator.

3.3 属性动画示例

插值器的实现

// Initialize Interpolators programmatically by loading them from their XML definitions
// provided by the framework.
mInterpolators = new Interpolator[]{
        new AnimationUtils().loadInterpolator(getActivity(),
                android.R.interpolator.linear),
        new AnimationUtils().loadInterpolator(getActivity(),
                android.R.interpolator.fast_out_linear_in),
        new AnimationUtils().loadInterpolator(getActivity(),
                android.R.interpolator.fast_out_slow_in),
        new AnimationUtils().loadInterpolator(getActivity(),
                android.R.interpolator.linear_out_slow_in)
};

动画的实现:这个ObjectAnimator对象,使用path来指定x和y的大小变化前后值。

// This ObjectAnimator uses the path to change the x and y scale of the mView object.
ObjectAnimator animator = ObjectAnimator.ofFloat(mView, View.SCALE_X, View.SCALE_Y, path);

// Set the duration and interpolator for this animation
animator.setDuration(duration);
animator.setInterpolator(interpolator);

animator.start();

code via Google Samples - Interpolator。

3.4 Property Animation与View Animation的区别

View Animation的优点,实现起来比较简单,只需要在XML定义并加载。但是全面性和灵活性比较低。

View Animation的不足

  • 只能针对View Objects做动画
  • 并且变化的方面比较少:例如,背景颜色等就无法实现。
  • View Animation的动画是画出来的,而不是View Object真正在移动。所以如果要真正移动View的话,在动画结束之后,自定写View Object的位移逻辑。

Property Animation可以消除以上局限。

3.5 API Overview

你可以从android.animation找到Property Animation的大多数API。因为View Animation体系已经构建了大量的interpolator插值器在android.view.animation,你也可以在Property Animation中使用。

Animator类提供了基本的创建动画的方法。你可以通过其子类实现自己需要的动画:

ValueAnimator

  • 提供计时器,动画值的计算
  • 动画是否重复播放
  • 动画的回调
  • the ability to set custom types to evaluate
  • 完整的属性动画包括:计算动画值,设置动画值给对象。使用ValueAnimator不会做第二部分操作。需要用户通过回调写赋值的逻辑。
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();

需要在回调中绑定Animator.AnimatorListenerr设置Object的属性。

ObjectAnimatorValueAnimator的子类。

  • 不需要用户在回调中写给Object赋值的逻辑。
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);//绑定Object与其属性
anim.setDuration(1000);
anim.start();

AnimatorSet设置动画组合。

例如,APIDemos - Bouncing Balls (该DEMO已不在Google Samples里),实现一系列动画:

  1. Plays bounceAnim.
  2. Plays squashAnim1, squashAnim2, stretchAnim1, and stretchAnim2 at the same time.
  3. Plays bounceBackAnim.
  4. Plays fadeAnim.
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();

4 动画矢量图片

矢量图片让您可以用在 XML 中定义的一个矢量图形替换多个 png 资源。在以前的版本中,矢量图片仅限于 Lollipop 和更高版本的设备,现在VectorDrawable和AnimatedVectorDrawable可分别通过两个新的支持内容库support-vector-drawable和animated-vector-drawable获取。
Android Support Library 23.2开始支持支持矢量图片和动画矢量图片。后续好好研究一下。

参考

android 动画分类 - 张兴业的博客 - 博客频道 - CSDN.NET

Android Animation - stormzhang

Android动画之XML(二) - 卡尔 - 博客频道 - CSDN.NET

Google Android Developer Doc Property Animation 更多关于API Overview,ValueAnimator与ObjectAnimator的使用,可以参考。

相关文章

网友评论

    本文标题:Android Animations

    本文链接:https://www.haomeiwen.com/subject/vunhrttx.html