baopbird2005 发表于 2015-09-17 13:47

AnimationDrawable内存溢出及判断结束

如果有更好的解决方案 欢迎大家共享
由于最近应用项目需要实现几个单帧小动画,于是选用AnimationDrawable。AnimationDrawable的用法
使用XML加载图片

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
   android:oneshot="true">   
   <item android:drawable="@drawable/image1" android:duration="200" />
   <item android:drawable="@drawable/image2" android:duration="200" />
   <item android:drawable="@drawable/image3" android:duration="200" />
</animation-list>
ImageView image = (ImageView) findViewById(R.id.image);
image .setBackgroundResource(R.drawable.anim_image); //anim_image为定义的XML文件
animation = (AnimationDrawable) image .getBackground();
//然后在监听事件里面调用
animation.start();
//如果需要在页面启动就打开需要重写 public void onWindowFocusChanged(boolean hasFocus) { }
//在此方法中启动
由于AnimationDrawable 并没有监听动画结束的方法,但是有时候确实需要监听结束来使用类似于结束隐藏等功能,于是采用一个比较笨的办法,

int duration = 0;//动画时间 调去每帧的时间 累加起来得到总的动画时间
for (int i = 0; i < animation .getNumberOfFrames(); i++) {
duration += animation .getDuration(i);
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
animation .stop();
animation =null; //这句话为解决内存溢出的关键,开始没有添加
layout.removeView(animView);
//System.gc();
}
}, duration);
显示动画的VIEW为 add进来的因为如果是处理 GONE和VISIBLE的话 发现显示会 显示2次动画。因为在imageview.setvisibility的时候 会启动和关闭动画 如果不需要在动画完成后隐藏的童鞋 则可以直接设置在布局中

如果最后一张图片设置的就是几毫秒,但是想让最后一张多显示几秒的话 在后面+上就可以,或者是直接在
anim_image 最后一张图 设置duration

如果图片较少 较小,则一般不会出现内存问题,因为我们的一个页面要显示4个动画,图片还都很大很大,测试使用的4.0小米1未发现任何问题,结果使用小米3和S4 发现内存溢出了,难道高级货还不如小米1吗?#24
发现4.0的系统没有问题,而在4.3的系统上则会内存溢出。网上搜索没有找到合适的解决方案
最后发现是没有在动画结束后 设置animation =null; 的问题,由于我所有的动画都是使用的同一个animation 只是在点击动画时给予不同的值(animation = (AnimationDrawable) imageview.getBackground();)造成的
页: [1]
查看完整版本: AnimationDrawable内存溢出及判断结束