Android动画的使用(一):补间动画与逐帧动画

一.逐帧动画

逐帧动画是最简单的动画,就是把一组图片一张一张的播放,组成一个动画,类似于gif图片。不多说,直接看用法。

1.定义xml文件

在res资源文件夹下新建文件夹anim,然后新建xml文件frame_anim.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/frampree0" android:duration="100"/>
    <item android:drawable="@drawable/frampree1" android:duration="100"/>
    <item android:drawable="@drawable/frampree2" android:duration="100"/>
    <item android:drawable="@drawable/frampree3" android:duration="100"/>
    <item android:drawable="@drawable/frampree4" android:duration="100"/>
    <item android:drawable="@drawable/frampree5" android:duration="100"/>
    <item android:drawable="@drawable/frampree6" android:duration="100"/>
    <item android:drawable="@drawable/frampree7" android:duration="100"/>
    <item android:drawable="@drawable/frampree8" android:duration="100"/>
    <item android:drawable="@drawable/frampree9" android:duration="100"/>
    <item android:drawable="@drawable/frampree10" android:duration="100"/>
    <item android:drawable="@drawable/frampree11" android:duration="100"/>
</animation-list>

frampree0-11是资源图片,即动画的12帧,duration表示这一帧持续的时间,加起来这动画就是1200ms,播放动画时将按照排列顺序播放。android:oneshot属性true表示动画运行一次,false表示周期性运行,不写默认为false.

2.逐帧动画使用

第一种方法:可以直接将上面定义好的动画资源引用给ImageView,类似这样。

    <ImageView android:id="@+id/anim_img" android:layout_width="100dp" android:layout_height="100dp" android:src="@anim/frame_anim"/>

直接运行就可以看到效果了。

第二种方法:java代码中赋值

        ImageView framview = (ImageView)findViewById(R.id.anim_img)
        framview.setImageResource(R.anim.prepross);
        //获取动画资源实行控制
        AnimationDrawable animationDrawable = (AnimationDrawable) framview.getDrawable();
        animationDrawable.start();//启动
        //animationDrawable.stop();//停止

二、补间动画

补间动画有四种:平移(translate)、旋转(rotate)、缩放(scale)和透明度渐变(alpha)

动画资源xml定义

动画资源定义都是在xml中定义,我们全部放到res/anim文件夹下。

1.平移动画(translate)

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 平移 -->
    <translate android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="860" android:toYDelta="0" android:fillAfter="true" android:repeatMode="reverse" android:repeatCount="1" android:duration="2000"/>

</set>

参数解释:

  • fromXDelta 和 fromYDelta 表示平移动画的起始坐标(屏幕左上角为(0,0),向右是x增加,向下是y增加)。
  • toXDelta 和 toYDelta 表示平移动画的终点坐标。
  • fillAfter 表示是否停止在终点位置
  • repeatMode 表示动画怎么循环播放,reverse是原地返回。restart表示重新开始。
  • repeatCount 表示循环次数。
  • duration 表示一次动画周期。

意思就是从起始坐标向终点坐标平移,平移消耗的时间是2000.

2.旋转动画(rotate)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <rotate  android:duration="2000" android:fromDegrees="0" android:interpolator="@android:anim/accelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="720" />

</set>

参数解释:

  • duration 表示一次动画周期。
  • fromDegrees 起始角度。
  • interpolator 表示变化的快慢。是一个函数叫插值器。accelerate_interpolator是变换越来越快
  • toDegrees 终止角度。就是从fromDegrees到toDegrees进行旋转。
  • repeatMode 表示动画怎么循环播放,reverse是原地返回。restart表示重新开始。
  • repeatCount 表示循环次数。
  • duration 表示一次动画周期。
  • pivotX,pivotY 表示变换的原点,就是说这点的位置不变,50%就是中间,然后以此点为中心进行旋转。

3.缩放动画(scale)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- 缩放图像,放大两倍再还原 -->
    <scale  android:duration="2000" android:fillAfter="true" android:fromYScale="1" android:interpolator="@android:anim/decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:repeatCount="1" android:repeatMode="reverse" android:toXScale="2.0" android:toYScale="2.0" />

</set>

参数解释:

  • fromYScale,fromXScale 表示y轴,x轴比例,开始时一般为1.
  • toXScale,toYScale 表示变换后的比例。x轴y轴比例都从1到2,就是整个图片放大2倍。只有一个轴比例变化,就是拉长了。
  • interpolator 表示变化的快慢。是一个函数叫插值器。decelerate_interpolator是变换越来越慢。
  • pivotX,pivotY 表示变换的原点,就是说这点的位置不变,50%就是中间,然后以此点为中心,其上下左右缩放。

4.透明度渐变动画(alpha)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 透明度渐变 -->
    <alpha android:fromAlpha="1" android:toAlpha="0" android:fillAfter="true" android:repeatMode="reverse" android:repeatCount="1" android:duration="2000" />
</set>

属性解释

  • fromAlpha 表示开始透明度
  • toAlpha 表示终点透明度
  • fillAfter 表示是否保持终点形态
  • repeatMode 表示动画怎么循环播放,reverse是原地返回。restart表示重新开始。
  • repeatCount 表示循环次数。
  • duration 表示一次动画周期。

动画就是开始透明度向终点透明度变化

5.组合动画

就是将上面的动画放到一起,随意组合,播放时将同时播放,通过设置startOffset可以让动画控制其播放时间。
下面就是边缩放边旋转。而旋转是顺时针旋转720度后再逆时针旋转360度。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

 <rotate  android:duration="2000" android:fromDegrees="0" android:interpolator="@android:anim/accelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="720" />
    <rotate  android:duration="2000" android:fromDegrees="360" android:interpolator="@android:anim/accelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:startOffset="2000" android:toDegrees="0" />
    <!-- 缩放图像,放大两倍再还原 -->
    <scale  android:duration="2000" android:fillAfter="true" android:fromYScale="1" android:interpolator="@android:anim/decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:repeatCount="1" android:repeatMode="reverse" android:toXScale="2.0" android:toYScale="2.0" />
</set>

2.补间动画使用

//可以加载上面定义的任意一个动画
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_rotate);

//让组件启动这个动画,然后就这个组件就按照动画定义那样动起来了。
TextView tvhello = (TextView) findViewById(R.id.hello);
tvhello.startAnimation(animation);

interpolator

interpolator翻译为插值器,我们定义动画时都是定义了开始状态和结束状态,而中间的状态由这个插值器进行插值。duration定义了这个动画的时间,默认这个时间是匀速变化的。然后interpolator就是在这期间对这个时间流逝的百分比(0-1之间)进行修改。(虽然不可思议,但他就是对时间的修改,进而控制过程),比如
interpolator改成2*a,然后变化曲线就变了,这样就是加快了速度(y=x和y=2x的区别),下一篇将介绍自定义interpolator,那么就会有直观的认识了。

这里介绍常用的interpolator

  • decelerate_interpolator 减速

  • accelerate_interpolator 加速

  • accelerate_decelerate_interpolator 先快后慢

  • cycle_interpolator 用于周期性动画,速率是正弦变化的

  • bounce_interpolator 弹球效果,在结束时回弹

  • linear_interpolator 匀速

你可能感兴趣的:(android,动画)