内存优化之设置图片显示所有方法对比
2016-09-12 17:25
357 查看
</pre> 今天有时间对比了一下所有设置图片或者背景的方式占用手机内存大小(三张全屏图片):<p></p><p> <span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 18px; "><em>第一种使用</em></span>:<span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em>setImageResource()方法,占用内存254M(魅蓝手机,没有OOM)</em></span></p><p><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em> 第二种使用:</em></span><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em>imageView.setImageBitmap(BitmapFactory.decodeResource());方法,占用内存240M,稍微好了一点</em></span></p><p><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em> 第三种:XML文件中设置src或者background(单张图片) 占用内存为84M</em></span></p><p><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em> 第四种:使用下面给出的方法设置图片 imageview.setImageBitmap(</em></span><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em>getBitmapFromRes(context,ResId));或者</em></span></p><p><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em> <span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 18px; "><em>imageview.setImageDrawable(new BitmapDrawable(<span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 18px; "><em>getBitmapFromRes(context,ResId)</em></span>)); 这两个方法得 到的结果是一样的,占用手机内存为40M</em></span></em></span></p><p><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 18px; "><em><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 18px; "><em> 第五种:给Button背景设置selector,这个对比如下(两张全屏大图测试),直接在xml文件中设置或者 button.setbackgroundResource(ResId);占用手机内存为158M</em></span></em></span></em></span></p><p><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 13.5pt;"><em><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 18px; "><em><span style="color: rgb(128, 128, 128); font-family: 宋体; font-size: 18px; "><em> 第六种:给Button背景设置selector,使用button.setbackground(normalResId);</em></span></em></span></em></span><span style="font-family: 宋体; font-size: 13.5pt; color: rgb(128, 128, 128); "><em>setClickState(</em></span><span style="font-family: 宋体; font-size: 13.5pt; "><em><span style="color:#000080;"><strong>button</strong></span></em></span><span style="font-family: 宋体; font-size: 13.5pt; color: rgb(128, 128, 128); "><em>,</em></span><span style="font-family: 宋体; font-size: 13.5pt; color: rgb(128, 128, 128); "><em>normalResId,</em></span><span style="font-family: 宋体; font-size: 13.5pt; color: rgb(128, 128, 128); "><em>pressResId);则占用内存为40M</em></span></p><p><span style="font-family: 宋体; font-size: 13.5pt; color: rgb(128, 128, 128); "><em></em></span></p><p> 综上分析得出结论如下:</p><p> 1.不要在xml文件中设置src,background</p><p> 2.不要在代码中直接用imgeview.setImageResource()</p><p> 3.不要在xml文件中设置selector</p><p></p><p> 下面是如何处理的两个关键方法(网上很多的,本人也是抄袭的):</p><p></p><p> </p><p></p><pre name="code" class="java">public static Bitmap getBitmapFromRes(Context context, int resId) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.ARGB_8888; opt.inPurgeable = true; opt.inInputShareable = true; //获取资源图片 InputStream is = context.getResources().openRawResource(resId); return BitmapFactory.decodeStream(is, null, opt); }
/**
* 设置按钮的正反选效果
*
* */
public void setClickState(final View view, final int normalResId, final int pressResId){
view.setOnTouchListener(new View.OnTouchListener() {
Bitmap pressBitmap;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:{
pressBitmap= getBitmapFromRes(view.getContext(), pressResId);
v.setBackgroundDrawable(new BitmapDrawable());
}
break;
case MotionEvent.ACTION_MOVE:{
v.setBackgroundDrawable(new BitmapDrawable(pressBitmap));
}
break;
default:{
v.setBackgroundDrawable(new BitmapDrawable(getBitmapFromRes(view.getContext(),normalResId)));
if(null!=pressBitmap&&!pressBitmap.isRecycled()){
pressBitmap.recycle();
pressBitmap=null;
}
}
break;
}
// 为了不影响监听按钮的onClick回调,返回值应为false
return false;
}});
}
相关文章推荐
- table设置背景图片,不能100%显示解决方法
- VC设置对话框背景图片 MFC显示背景图片方法
- 遍历目录下所有图片文件显示的方法.(已废弃)
- 关于设置 存储 内部存储空间只显示图片不显示视频的解决方法
- 基于jquery的文章中所有图片width大小批量设置方法
- iOS设置圆角图片的方法及对比
- WinCE显示资源中BMP图片的几种方法对比
- Android读取assets目录下的所有图片并显示的方法
- Eclipse设置选中方法名 或者 字节 ,文章中所有的相同字段 高亮显示
- C#显示文件夹下所有图片文件的方法
- Image加载图片,设置图片,存入SD卡,所有方法
- 文章中所有图片width大小批量设置方法
- 【File Field控件】上传图片的同时直接显示图片的属性设置方法
- Qt-Quick中设置组件风格、显示一张图片、在一行显示多张图片的方法、绘制图片方法...
- getElementsByTagName 方法来刷新显示所有图片
- 在WORD中设置,每页都显示相同内容的方法。
- 快速保存网页中所有图片的方法
- 图片完全载入前显示loading的方法.
- 用TreeView控件实现资源管理器(显示本地硬盘下所有文件夹和文件,并可以浏览图片)(示例代码下载)
- 快速保存网页中所有图片的方法