Android动画技术点总结(二)——逐帧动画

快捷链接:
Android动画技术点总结(一)——View动画

2.逐帧动画

逐帧动画就像是GIF,快速更换图片,主要有AnimationDrawable完成,用起来比较简单,所以扩展性不强,讲一下AnimationDrawable就好了。
例子,素材图是我把一个GIF的每一帧图片拆出来的


frame.gif

原GIF(如有侵权,敬请告知,立刻删除)


Android动画技术点总结(二)——逐帧动画_第1张图片
原GIF.gif(如有侵权,敬请告知,立刻删除)

2.1 使用

素材
Android动画技术点总结(二)——逐帧动画_第2张图片
素材.png
代码

在drawable目录下创建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问题,下面的截图是关于我这个例子内存变化。

Android动画技术点总结(二)——逐帧动画_第3张图片
内存变化.png

可以看到动画播放前后,内存开销突然增加了38.20MB - 30.02MB = 8.18MB,且增加的基本都是Graphics(图像缓存等,包括GL surfaces, GL textures等)。所以使用逐帧动画的时候,还是量力而行,尽量不要使用太大的图片。

快捷链接:
Android动画技术点总结(一)——View动画

你可能感兴趣的:(Android动画技术点总结(二)——逐帧动画)