96编辑器旗下产品
找图
终身
ID:0
到期时间:永久
退出登录
您的位置:首页 > 百科管理 > 详情

android加载长图片素材-Android 图片加载(一)高效加载Bitmap 基础篇

原创:找图网 2023-06-25 14:32:58
  • android imageview加载长图Glide+SubsamplingScaleImageView混合加载渲染

  • 长图图片地址:

    使用第三方加载图片插件:

    第三方imageview的github地址:

    布局:

    加载使用方法

  • Android 图片加载(一)高效加载Bitmap 基础篇

  • 由于Bitmap的特殊性以及Android对单个应用所规定的最大内存限制,我们在同时加载大量Bitmap时很容易发生

    内存溢出

    ,即我们通常所说的OutOfMemoryError(OOM),因此高效加载Bitmap就成为了每个Android开发者的必备技能。

    在学习如何高效地加载Bitmap之前,首先介绍一下如何加载一个Bitmap。我们都知道,Bitmap在Android中通常指的是一张图片,那么如何将JPG、PNG等格式的图片转换成Bitmap对象呢?BitmapFactory类给我们提供了一些方法:

    接下来开始介绍如何高效地加载Bitmap,其实核心思想很简单:

    就是采用参数来调整图片尺寸来适配控件的大小。

    假如我们显示图片的控件ImageView宽高为100×100像素,而图片的尺寸为1024×1024像素,这个时候如果将整个图片加载进来并显示到控件上,自然是很占用内存资源的。这个时候可以通过按一定的

    采样率

    加载缩小后的图片,再将缩小后的图片显示到ImageView中,这样就能减小内存占用从而在一定程度上避免OOM的发生。

    通过来缩放图片,主要是使用它的inSampleSize参数,也就是前面提到的采样率。当采样率inSampleSize为1时,采样后的图片大小为原图大小;当采样率inSampleSize>1,比如为2时,采样后的图片宽高都为原图的1/2,即像素降为原图的1/4,占用的内存大小也就是原图的1/4;比较特殊的是,当采样率inSampleSize<1时,系统会自动将该值当做1来处理。

    因此可以得出一个结论:采样率inSampleSize必须是大于1的整数图片才会有缩小的效果,并且采样率同时作用于宽高,也就是说采样后的图片会缩小到原图的1/(inSampleSize^2)。比如inSampleSize=4,那么缩放比例为1/16。

    我们现在知道了,通过采样率可以提高图片的加载效率,那么如何才能计算出最合适的采样率?我们可以按照如下流程:

    接下来以decodeFile方法为例实现图片的缩放,其他三个方法处理方式类似。

    下一篇: Android 图片加载(二)图片加载框架Glide 入门篇

    《Android开发艺术探索》

  • Android:深入剖析图片加载库Glide缓存功能(源码分析)

  • Glide 需要缓存的 图片资源 分为两类:

    Glide 的缓存机制使得 Glide 具备非常好的图片缓存效果,从而使得具备较高的图片加载效率。

    下面,我将根据 Glide 缓存流程中的每个步骤 进行源码分析。

    至此, Glide 的图片缓存 Key 生成完毕。

    至此,创建好了缓存对象 LruResourceCache

    即:

    源码分析如下:

    若上述两个方法都没获取到缓存图片时(即内存缓存里没有该图片的缓存),就开启新线程加载图片。

    若无法从 内存缓存 里 获得缓存的图片, Glide 就会采用第2级缓存:磁盘缓存 去获取缓存图片

    写入 内存缓存分为:写入 弱引用缓存 & LruCache 算法的缓存

    写入 LruCache 算法 内存缓存的原理:包含图片资源 resource 的 EngineResource 对象的一个引用机制:

    所以:

    至此,实现了:

    至此, Glide 的图片缓存流程解析完毕。

    Android图片加载的那些事:为什么你的Glide 缓存没有起作用?

    不定期分享关于

    安卓开发

    的干货,追求

    短、平、快

    ,但

    却不缺深度

    最新文章 更多
    最新素材 更多
    公司介绍 网站地图 图片资讯
    Copyright © 2010-2022 山东找图网络科技有限公司  鲁ICP备18007836号-3  邮箱:15653358549@163.com