关于andriod图片的优化

  • 对图片本身进行操作。尽量不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图,因为这些方法在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。如果在读取时加上图片的Config参数,可以更有效的减少加载的内存,从而更有效阻止抛出内存异常。另外,decodeStream直接拿图片来读取字节码了,不会根据机器的各种分辨率来自动适应,使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。
  • InputStream is = this.getResources().openRawResource(R.drawable.pic1);
    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inJustDecodeBounds = false;
    options.inSampleSize = 10;   //width,hight设为原来的十分一
    Bitmap btp =BitmapFactory.decodeStream(is,null,options);

    if(!bmp.isRecycle() ){
             bmp.recycle()   //回收图片所占的内存
             system.gc()  //提醒系统及时回收
    }

    [url=][/url]
    /**
      * 以最省内存的方式读取本地资源的图片
      * @param context
      * @param resId
      * @return
      */
    publicstatic Bitmap readBitMap(Context context, int resId){  
          BitmapFactory.Options opt = new BitmapFactory.Options();  
          opt.inPreferredConfig = Bitmap.Config.RGB_565;   
          opt.inPurgeable = true;  
          opt.inInputShareable = true;  
    //获取资源图片  
          InputStream is = context.getResources().openRawResource(resId);  
    return BitmapFactory.decodeStream(is,null,opt);  
    }[url=][/url]

  • option中的值指的是,图片进行缩放的比例,SDK中建议其值是2的指数值,值越大会导致图片不清晰。长度、宽度都只有原图片的1/2。图片大小减少,占用的内存自然也变小了。这么做的弊端是图片质量变差,inSampleSize的值越大,图片的质量就越差。由于各手机厂商缩放图片的算法不同,在不同手机上的缩放图片质量可能会不同。笔者就遭遇过moto手机上图片缩放后质量可以接受,三星手机上同样的缩放比例,质量却差很多的情况。

    Android中有四种,分别是:
    ALPHA_8:每个像素占用1byte内存
    ARGB_4444:每个像素占用2byte内存
    ARGB_8888:每个像素占用4byte内存
    RGB_565:每个像素占用2byte内存
    Android默认的颜色模式为ARGB_8888,这个颜色模式色彩最细腻,显示质量最高。但同样的,占用的内存也最大。
    以上代码即是将1.png以ARGB_4444模式读出。内存减少虽然不如第一种方法明显,但是对于大多数图片,看不出与ARGB_8888模式有什么差别。不过在读取有渐变效果的图片时,可能有颜色条出现。另外,会影响图片的特效处理。
    优化Dalvik虚拟机的堆内存分配。对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或    耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。使用方法:  
private final static float TARGET_HEAP_UTILIZATION = 0.75f;VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 
即可。
   还有就是可以定义堆内存的大小。
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
//设置最小heap内存为6MB大小

3、调用图片的recycle()方法:
这个其实不是真正降低图片内存的方法。主要目的是标记图片对象,方便回收图片对象的本地数据。图片对象的本地数据占用的内存最大,而且与程序Java部分的内存是分开计算的。所以经常出现Java heap足够使用,而图片发生OutOfMemoryError的情况。在图片不使用时调用该方法,可以有效降低图片本地数据的峰值,从而减少OutOfMemoryError的概率。不过调用了recycle()的图片对象处于“废弃”状态,调用时会造成程序错误。所以在无法保证该图片对象绝对不会被再次调用的情况下,不建议使用该方法。特别要注意已经用setImageBitmap(Bitmap img)方法分配给控件的图片对象,可能会被系统类库调用,造成程序错误。
4、使用Matrix对象放大的图片如何更改颜色模式:
虽然使用Matrix对象放大图片,必定会耗费更多的内存,但有时候也不得不这样做。放大后的图片使用的ARGB_8888颜色模式,就算原图片是ARGB_4444颜色模式也一样,而且没有办法在放大时直接指定颜色模式。可以采用以下办法更改图片颜色模式。
代码如下  
Matrix matrix = new Matrix();
float newWidth = 200;//图片放大后的宽度
float newHeight = 300;//图片放大后的长度
matrix.postScale(newWidth / img.getWidth(), newHeight/ img.getHeight());
Bitmap img1 = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);//得到放大的图片
img2 = img1.copy(Bitmap.Config.ARGB_4444, false);//得到ARGB_4444颜色模式的图片
img = null;
img1 = null;
这里比起原来的图片额外生成了一个图片对象img1。但是系统会自动回收img1,所以实际内存还是减少了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中使用 RecyclerView 加载图片时,可以使用 Glide 库进行图片加载,同时可以通过以下几种方式进行滑动时图片加载的优化: 1. 设置缓存策略:通过设置 Glide 的缓存策略,可以减少图片加载时的网络请求,提高加载速度。可以使用如下代码设置缓存策略: ``` RequestOptions requestOptions = new RequestOptions() .diskCacheStrategy(DiskCacheStrategy.ALL) .skipMemoryCache(false); Glide.with(context) .setDefaultRequestOptions(requestOptions) .load(url) .into(imageView); ``` 上述代码中,`diskCacheStrategy(DiskCacheStrategy.ALL)` 表示将图片缓存在磁盘中,`skipMemoryCache(false)` 表示不跳过内存缓存。 2. 设置占位符和错误图片:通过设置占位符和错误图片,可以在图片加载失败或者未加载完成时,显示一张默认的图片,避免出现空白的情况,同时也可以提高用户体验。可以使用如下代码设置占位符和错误图片: ``` RequestOptions requestOptions = new RequestOptions() .placeholder(R.drawable.placeholder) .error(R.drawable.error) .diskCacheStrategy(DiskCacheStrategy.ALL) .skipMemoryCache(false); Glide.with(context) .setDefaultRequestOptions(requestOptions) .load(url) .into(imageView); ``` 上述代码中,`placeholder(R.drawable.placeholder)` 表示在图片加载之前显示的占位符图片,`error(R.drawable.error)` 表示图片加载失败时显示的错误图片。 3. 取消加载任务:在 RecyclerView 滑动时,可能会存在用户滑动过快,导致部分图片未加载完成,此时需要在滑动停止时,及时取消未完成的加载任务,避免加载任务过多,影响性能。可以使用如下代码取消加载任务: ``` @Override public void onViewDetachedFromWindow(@NonNull ViewHolder holder) { super.onViewDetachedFromWindow(holder); Glide.with(context).clear(holder.imageView); } ``` 上述代码中,`onViewDetachedFromWindow` 方法表示视图从窗口中移除时会被调用,通过 `Glide.with(context).clear(holder.imageView)` 取消当前视图中的加载任务。 通过上述优化方式,可以提高 RecyclerView 加载图片时的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值