一.逐帧动画
逐帧动画是最简单的动画,就是把一组图片一张一张的播放,组成一个动画,类似于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 匀速