Android View Animation

作者: AeolusFei | 来源:发表于2017-05-22 23:09 被阅读32次

    Animation -- View Animation

    官方Api

    帧动画

    帧动画就是通常所说的Frame动画。Frame动画是一系列图片按照一定的顺序展示的过程。
    帧动画的原理:在一定的时间段内切换多张有细微差异的图片从而达到动画的效果。

    Frame动画可以被定义在XML文件中,也可以完全编码实现。
    如果被定义在xml文件中,可放置在/res下的anim 或 drawable 目录中,文件名可以作为资源id在代码
    中引用;
    如果完全由编码实现,需要使用到AnimationDrawable对象。
    需要注意的是,当我们在xml文件中定义帧动画时:
    <animation-list>元素必须要作为根元素,它可以包含一个或多个<item>元素。
    android:onshot如果定义为 true 的话,此动画只会执行一次,如果为 false 则一直循环。
    <item>元素代表一帧动画,android:drawable指定此帧动画所对应的图片资源,android:duration代表此帧持续的时间,单位为毫秒。

    例子:在 res/drawable 中 有5张类似的图片,图片名从ic_heart_0 ~ ic_heart_4,每张图片有些微差异。
    定义一个名为heart_anim.xml的帧动画存放在res/drawable目录下,代码为:

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:onshot="true">
        
        <item
            android:duration="500"
            android:drawable="@drawable/ic_heart_0"/>
    
        <item
            android:duration="500"
            android:drawable="@drawable/ic_heart_1"/>
    
        <item
            android:duration="500"
            android:drawable="@drawable/ic_heart_2"/>
    
        <item
            android:duration="500"
            android:drawable="@drawable/ic_heart_3"/>
    
        <item
            android:duration="500"
            android:drawable="@drawable/ic_heart_4"/>
    
    </animation-list>
    

    定义好后,我们还需要讲动画设置给某个View,例如,将该动画设置为某个ImageView背景,代码如下:

    <ImageView
        android:id="@+id/imageview_anim"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/heart_anim"/>
    

    但是,此时动画并不会在 ImageView 显示时启动,还需要通过Java代码来启动该动画:

        ImageView mImageView = (ImageView)findViewById(R.id.imageview_anim);
        ((AnimationDrawable) mImageView.getBackground()).start();
    

    这样,帧动画就会启动了。
    通过Java代码方式构建帧动画:

    AnimationDrawable anim = new AnimationDrawable();
    for (int i = 0; i < 5; i++){
        int id = getResources().getIdentifier("ic_heart_" + i, "drawable", getPackageName());
        Drawable drawable = getResources().getDrawable(id);
        anim.addFrame(drawable, 300);
    }
    anim.setOneShot(false);
    mImageView.setBackgroundDrawable(anim);
    anim.start();
    

    补间动画

    tween动画是操作某个空间让其展现出旋转、渐变、移动、缩放的一种转换过程,这称为补间动画。
    同样的,可以以XML形式定义动画,也可以编码实现。

    若以XML形式定义一个动画,我们按照动画的定义语法完成XML,并放置于 /res/anim 目录下,文件名可以作为资源id倍引用;
    若由编码方式实现,需要使用到Animation对象。

    补间动画只能运用在View对象上,并且功能相对来说较为局限。因此,补间动画通常用于执行一些较为简单的动画。

    下面是一个补间动画集合与补间动画的格式。该集合包含了多个动画,在执行该动画集合时,它们将一起执行。

    <?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:toAlpah="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>
    

    xml 文件必须有一个根元素,可以是<alpha><scale><translate><rotate>中的任意一个,也可以是<set>来管理一个由前面几个元素组成的动画集合。

    <set>是一个动画容器,管理多个动画的群组,与之对应的Java对象时AnimationSet
    它有两个属性:

    • android:interpolator代表一个插值器资源,可以引用系统自带插值器资源,如下表。当然也可以使用自定义插值器资源,默认值是匀速插值器。
    • android:shareInterpolator代表<set>里面的多个动画是否要共享插值器,默认值是true。若设为false,那么<set>的插值器就不再起作用,需要在每个动画中加入插值器。
    Interpolator 资源id 功能作用
    AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 先加速再减速
    AccelerateInterpolator @android:anim/accelerate_interpolator 加速
    AnticipateInterpolator @android:anim/anticipate_interpolator 先回退一小步然后加速前进
    AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 在上一个基础上超出终点一小步再退回终点
    BounceInterpolator @android:anim/bounce_interpolator 最后阶段弹球效果
    CycleInterpolator @android:anim/cycle_interpolator 周期运动
    DecelerateInterpolator @android:anim/decelerate_interpolator 减速
    LinearInterpolator @android:anim/linear_interpolator 匀速
    OvershootInterpolator @android:anim/overshoot_interpolator 快速到达终点并超出一小步最后回到终点

    <alpha> 是透明度的渐变动画,可以实现淡入、淡出的效果,与之对应的Java对象是 AlphaAnimation
    android:fromAlpha 属性代表起始alpha值、浮点值,范围在 0.0 和 1.0 之间,分别代表透明和完全不透明;
    android:toAlpha 属性代表结尾alpha值、浮点值,范围在 0.0 和 1.0 之间。

    <scale> 是缩放动画,可以实现动态调整控件尺寸的效果,与之对应的Java对象是 ScaleAnimation
    android:fromXScale 性代表起始的X方向上相对自身的缩放比例,浮点值,1.0代表自身无变化,0.5表示缩小1倍,2.0表示方法一倍;
    android:toXScale 属性代表结尾的X方向上相对自身的缩放比例,浮点值;
    android:fromYScale 属性代表起始的Y方向上相对自身的缩放比例,浮点值;
    android:toYScale 属性代表结尾的Y方向上相对自身的缩放比例,浮点值。

    android:pivotX 属性代表缩放的中轴点X坐标,浮点值;
    android:pivotY 属性代表缩放的中轴点Y坐标,浮点值。
    对于上面这两个属性,若想表示中轴点为图像的中心,可以把两个属性值定义为0.5或者50%。

    <translate> 是位移动画,代表一个水平、垂直的位移,与之对应的Java对象是 TranslateAnimation
    android:fromXDelta 属性代表起始X方向上的位置;
    android:toXDelta 属性代表结尾X方向上的位置;
    android:fromYDelta 属性代表起始Y方向上的位置;
    android:toYDelta 属性代表结尾Y方向上的位置。
    以上四个属性都支持三种表达方式:

    • 浮点数:相对自身原始位置的像素值
    • num%:相对自己的百分比
    • num%p:相对父类组件的百分比。

    <rotate> 是旋转动画,与之对应的Java对象是 RotateAnimation
    android:fromDegrees 属性代表起始角度,浮点值,单位:度;
    android:toDegrees 属性代表结尾角度,浮点值,单位:度;
    android:pivotX 属性代表旋转中心的X坐标值;
    android:pivotY 属性代表旋转中心的Y坐标值。
    以上两个属性有三种表达方式:

    • 数字:相对于自身左边缘的像素值
    • num%:相对于自身左边缘或顶边缘的百分比
    • num%p:相对于父容器的左边缘或顶边缘的百分比。

    相关文章

      网友评论

        本文标题:Android View Animation

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