• Bitmap的加载和Cache-学习笔记1


    图片的缓存策略(通过缓存策略不需要每次都从网络上请求图片后者从存储设备中加载图片):

      常见的缓存策略是:LruCache和DiskLruCache,其中LruCache常被用做内存缓存,而DiskLruCache常被用做存储缓存。

    Lru是Least Recently Used的缩写,即最近最少使用算法:当缓存快满时,会淘汰近期最少使用的缓存目标。

    Bitmap的高效加载:

      1.如何加载一个Bitmap:

         Bitmap在Android中指的是一张图片,可以是png、jpg等图片格式;BitmapFactory类提供了四类方法:decodeFile、DecodeResource、decodeStream和decodeByteArray,

    decodeFile-----从文件系统中加载出一个Bitmap对象

    DecodeResource-----从资源中加载出一个Bitmap对象

    decodeStream-----从输入流中加载出一个Bitmap对象

    decodeByteArray-----从字节数组中加载出一个Bitmap对象

    其中decodeFile和decodeResource又间接调用了decodeStream方法,这四类方法在底层实现。

      2.高效加载Bitmap

         (1)采用BitmapFactory.Options来加载所需尺寸的图片,可以按一定的采样率来加载缩小后的图片,将缩小后的图片在ImageView中显示,能降低内存占用并一定程度上避免OOM,挺高了

    Bitmap加载时的性能,1中的BitmapFactory四类方法都支持BitmapFactory.Options参数。

         (2)获取采样率流程:

                 a.将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图片--只会解析图片的原始宽/高信息,并不会真正地加载图片

                 b.从BitmapFactory.Options中取出图片的原始宽高信息,它们对应于onWidth和outheight参数

                 c.根据采样率的规则并结合目标View的所需大小计算出采样率inSampleSize

                 d.将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载图片

    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;//设为true并加载图片
    BitmapFactory.decodeResource(res, resId, options);

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);//取出原始宽高

    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeResource(res, resId, options);//重新加载
    }

    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;//原始大小

    if (height > reqHeight || width > reqWidth) {
    final int halfHeight = height / 2;
    final int halfWidth = width / 2;

    while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
    inSampleSize *= 2;//2的次方 采样率
    }
    }
    return inSampleSize;
    }
    实际使用(所期望的图片大小为100x100像素):
    mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResource(),R.id.myimage,100,100));
  • 相关阅读:
    centos 7 部署confluence
    在Ubuntu操作系统里安装Docker
    Python模块-pip
    微信小程序 等宽不等高瀑布流
    微信小程序 保存图片和复制文字 功能
    C# 模拟鼠标移动和点击
    使用Fiddler抓包工具更改请求的url请求参数
    C#中Request.ServerVariables详细说明及代理
    (C# webservice 获取客户端IP疑难杂症)---试过n种方法都失败,获取代理服务器,访问者客户端真实IP
    C# 命名管道中客户端访问服务器时,出现“对路径的访问被拒绝”
  • 原文地址:https://www.cnblogs.com/banzhuan/p/6861976.html
Copyright © 2020-2023  润新知