免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1908 | 回复: 0
打印 上一主题 下一主题

[Android] AnimationDrawable内存溢出及判断结束 [复制链接]

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-17 13:47 |只看该作者 |倒序浏览
如果有更好的解决方案 欢迎大家共享
由于最近应用项目需要实现几个单帧小动画,于是选用AnimationDrawable。AnimationDrawable的用法
使用XML加载图片

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
     androidneshot="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();)造成的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP