快捷链接:
Android动画技术点总结(一)——View动画
2.逐帧动画
逐帧动画就像是GIF,快速更换图片,主要有AnimationDrawable完成,用起来比较简单,所以扩展性不强,讲一下AnimationDrawable就好了。
例子,素材图是我把一个GIF的每一帧图片拆出来的
frame.gif
原GIF(如有侵权,敬请告知,立刻删除)
原GIF.gif(如有侵权,敬请告知,立刻删除)
2.1 使用
素材
素材.png代码
在drawable目录下创建animation-list标签的文件
<!--frame_anim.xml-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/frame_00" android:duration="90" />
<item android:drawable="@drawable/frame_01" android:duration="90" />
<item android:drawable="@drawable/frame_02" android:duration="90" />
<item android:drawable="@drawable/frame_03" android:duration="90" />
<item android:drawable="@drawable/frame_04" android:duration="90" />
<item android:drawable="@drawable/frame_05" android:duration="90" />
<item android:drawable="@drawable/frame_06" android:duration="90" />
<item android:drawable="@drawable/frame_07" android:duration="90" />
<item android:drawable="@drawable/frame_08" android:duration="90" />
<item android:drawable="@drawable/frame_09" android:duration="90" />
<item android:drawable="@drawable/frame_10" android:duration="90" />
<item android:drawable="@drawable/frame_11" android:duration="90" />
<item android:drawable="@drawable/frame_12" android:duration="90" />
<item android:drawable="@drawable/frame_13" android:duration="90" />
</animation-list>
在Java代码中使用即可
ImageView image = findViewById(R.id.image);
image.setImageResource(R.drawable.frame_anim);
AnimationDrawable drawable = (AnimationDrawable) image.getDrawable();
drawable.start();
纯Java也可以实现
ImageView image = findViewById(R.id.image);
int[] resIds = new int[]{
R.drawable.frame_00,
R.drawable.frame_01,
R.drawable.frame_02,
R.drawable.frame_03,
R.drawable.frame_04,
R.drawable.frame_05,
R.drawable.frame_06,
R.drawable.frame_07,
R.drawable.frame_08,
R.drawable.frame_09,
R.drawable.frame_10,
R.drawable.frame_11,
R.drawable.frame_12,
R.drawable.frame_13,
};
AnimationDrawable animationDrawable = new AnimationDrawable();
Resources resources = getResources();
for (int resId : resIds) {
animationDrawable.addFrame(resources.getDrawable(resId), 90);
}
image.setImageDrawable(animationDrawable);
animationDrawable.start();
还是使用xml方便一些。
属性
xml | Java方法 | 参数 | 描述 |
---|---|---|---|
android:drawable | addFrame第一个参数 | xml为drawable资源,java参数为Drawable对象 | 动画每一帧的资源文件 |
android:duration | addFrame第二个参数 | int | 当前帧持续时间 |
android:oneshot | setOneShot | boolean,默认为false | 如果为true,则动画将仅运行一次然后停止 |
内存开销问题
几乎所有关于朱桢动画的文章都会提及OOM问题,下面的截图是关于我这个例子内存变化。
内存变化.png可以看到动画播放前后,内存开销突然增加了38.20MB - 30.02MB = 8.18MB,且增加的基本都是Graphics(图像缓存等,包括GL surfaces, GL textures等)。所以使用逐帧动画的时候,还是量力而行,尽量不要使用太大的图片。
网友评论