逐帧动画是最简单的动画,就是把一组图片一张一张的播放,组成一个动画,类似于gif图片。不多说,直接看用法。
在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.
第一种方法:可以直接将上面定义好的动画资源引用给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中定义,我们全部放到res/anim文件夹下。
<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>
参数解释:
意思就是从起始坐标向终点坐标平移,平移消耗的时间是2000.
<?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>
参数解释:
<?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>
参数解释:
<?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>
属性解释
动画就是开始透明度向终点透明度变化
就是将上面的动画放到一起,随意组合,播放时将同时播放,通过设置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>
//可以加载上面定义的任意一个动画
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_rotate);
//让组件启动这个动画,然后就这个组件就按照动画定义那样动起来了。
TextView tvhello = (TextView) findViewById(R.id.hello);
tvhello.startAnimation(animation);
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 匀速