您的位置:首页 > 其它

内存优化之设置图片显示所有方法对比

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;
}});
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: