android 帧动画的实现及图片过多时OOM解决方案

Posted 神锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 帧动画的实现及图片过多时OOM解决方案相关的知识,希望对你有一定的参考价值。

一,animation_list.xml中静态配置帧动画的顺序,如下:
<?xml version="1.0" encoding="utf-8"?>
    android:oneshot="true" >
 
    <item
        android:drawable="@drawable/animation_1"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/animation_2"
        android:duration="100"/>
    <item
        android:drawable="@drawable/animation_3"
        android:duration="100"/>
    <item
        android:drawable="@drawable/animation_4"
        android:duration="100"/>
    <item
        android:drawable="@drawable/animation_5"
        android:duration="100"/>
</animation-list>
注意:
1,android:duration="100" 指的是相应帧持续的时间。
2,android:oneshot 的配置 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
二、方法中调用,如下:
mImageView.setImageResource(R.drawable.animation_list);
animationDrawable = (AnimationDrawable) mImageView.getDrawable();
animationDrawable.start();
当然,也可以在方法中动态设置动画的播放,调用如下方法:
void setOneShot(boolean oneShot):设置AnimationDrawable是否执行一次,true执行一次,false循环播放
这时也可以中途控制动画的播放与停止,如下所示:
mImageView.setImageResource(R.drawable.animation_list);
animationDrawable = (AnimationDrawable) mImageView.getDrawable();
if(animationDrawable.isRunning()){    //当前AnimationDrawable是否正在播放
              animationDrawable.stop();    //停止播放逐帧动画。
}
animationDrawable.start();  //开始播放逐帧动画。
三、OOM解决方案(一):
使用以上方法基本可以解决20张图片以内的帧动画了,但是图片一多,便会报OOM错误,
以下是我的一个解决方案,不是最好的,我也觉得有很多问题,但确实解决了这个问题,
姑且称为方案一,相信我还会想到更好的解决方案,到时候再与大家分享
1,首先在初始化时,直接初始化两个数组,一个保存每一帧照片,另一个保存每一帧图片的持续时间
 images = new int [42];
   images[0] = R.drawable.animation_0;     //动画开始时的动画
        images[1] = R.drawable.animation_1;
        images[2] = R.drawable.animation_2;
        images[3] = R.drawable.animation_3;
                  ......
        images[40] = R.drawable.animation_40;
        images[41] = R.drawable.animation_41;   //动画结束时的画面
 
durations = new int[40] ;
        durations[0] = 200;  //事件触发后多长事件开始动画
        durations[1] = 100;
        durations[2] = 200;
              ......
        durations[40] = 300;
2,新建myAnimation类:
   public class myAnimation{
        private ImageView mImageView;   //播方动画的相应布局
        private int[] mImageRes;
        private int[] durations;      
 
        public myAnimation(ImageView pImageView, int[] pImageRes,
                int[] durations) {
            this.mImageView = pImageView;
            this.durations = durations;
            this.mImageRes= pImageRes;       
            mImageView.setImageResource(mImageRes[1]);
            play(1);
        }
 
        private void play(final int pImageNo) {
            mImageView.postDelayed(new Runnable() {
                public void run() {
                    mImageView.setImageResource(mImageRes[pImageNo]);
                    if (pImageNo == mImageRes.length-1)
                        return;
                    else
                        play(pImageNo + 1);
                }
            }, durations[pImageNo-1]);
        }         
    }
3,在监听事件中新建一个myAnimation类的对象即可:
  new myAnimation(ImageView, images,durations);
 
 
--------------------------------------------------------------------------------------------
刚开始学习,写博客只是希望能记录自己的成长轨迹,欢迎大家指点。

以上是关于android 帧动画的实现及图片过多时OOM解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Android之动画

Android 动画详解

让App中增加LruCache缓存,轻松解决图片过多造成的OOM

如何解决上传多张图片时遇到的oom问题

Android开发艺术探索——第七章:Android动画深入分析

Android实现帧动画,以及出场时的动画