现在的位置: 首页 > 综合 > 正文

Animation总结

2017年11月05日 ⁄ 综合 ⁄ 共 3399字 ⁄ 字号 评论关闭

Android提供了两类的Animation:

1. Property Animation——相关类在包android.animation中

2. View Animation——相关类在android.view.animation中,也即它是与视图相关的

View Animation又分了两类:

(1)Frame Animation——它相关的使用类是AnimationDrawable

我们只需要记住这是一个Drawable,它的使用与其它Drawable资源并没有多大的不同。当然AnimationDrawable也提供了相应的接口,我们可以在XML中实现,也可以在代码中实现。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();

动画的启动是调用start()方法,注意这个方法的调用不能在onCreate()中,因为此时动画资源并没有完全加载到窗口,比较好的方法是放置在onWindowFocusChanged()中。

(2)Tween Animation——对一张图片实现的动画,比如缩放。

查看源码,我们就不难理解补间动画的定义和它的动画效果的实现方式。比如对其中的ScaleAnimation而言,缩放的效果是通过Matrix矩阵变换实现的,本质上来说,都是动态的对位图实行变换操作。这也就是为什么补间动画只有四种——AlphaAnimation,ScaleAnimation,TranslateAnimation和RotateAnimation,因为一张图片的矩阵变换也就此四种。

Animation抽象类是这四个类的基类,我们也可以模仿他们通过矩阵变换或其它操作位图的方式实现自己的补间动画,比如组合其中两种同时变化。

补间动画的基本使用格式如下:

这里我们只介绍XML格式。

首先,它的XML文件往往是作为一种单独的动画资源文件保存在res/anim/文件夹下的,也就是说,这个文件夹下对应的资源文件的对象都是Animation类的对象(理解多态和XML文件表示的也是类对象)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>

这里涉及到的一些属性资源的含义和使用方法都可以通过API查到,这里不作介绍。唯一可能有点难度的是interpolator这个属性,我们后面再做介绍。

ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);

在代码中通过调用AnimationUtils.loadAnimation()装载这个动画资源,然后调用startAnimation启动动画。

Property Animation

View Animation针对的使用对象都是View,而Property Animation针对的使用对象则是所有对象,明白了这一点就知道了二者的差别。

这里我们先不探讨它的实现原理,而只是作一个总结性的了解它的使用。

属性动画的基类是Animator.java,在XML中,它也是一种动画资源。与视图动画相区别,它的xml文件保存在res/animator/文件夹中:

<set android:ordering="sequentially">
    <set>
        <objectAnimator
            android:propertyName="x"
            android:duration="500"
            android:valueTo="400"
            android:valueType="intType"/>
        <objectAnimator
            android:propertyName="y"
            android:duration="500"
            android:valueTo="300"
            android:valueType="intType"/>
    </set>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="1f"/>
</set>

这里使用的对象节点就是具体的Animator子类对象名称。

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
    R.anim.property_animator);
set.setTarget(myObject);
set.start();

上面的调用是启动属性动画的方法。

上面就简单总结了视图动画和属性动画的定义和使用方法,其中视图动画的使用对象针对的是View视图,属性对话的使用对象则是所有Object。

视图动画又分为两种,其一是桢动画,它可以当作一个完全的Drawable资源实现;其二是补间动画,它是通过矩阵变化等方法操作位图实现的,因此补间动画也是针对单一位图的动画。

抱歉!评论已关闭.