详解Android GLide图片加载常用几种方法

目录
  • 缓存浅析
  • GLide图片加载方法
    • 图片加载周期
    • 图片格式(Bitmap,Gif)
    • 缓存
    • 集成网络框架
    • 权限
    • 占位符
    • 淡入效果
    • 变换
    • 启动页/广告页
    • banner
    • 固定宽高
    • 圆角
    • 圆形
  • 总结

缓存浅析

为啥要做缓存? android默认给每个应用只分配16M的内存,所以如果加载过多的图片,为了 防止内存溢出 ,应该将图片缓存起来。

图片的三级缓存分别是:

  • 1、内存缓存
  • 2、本地缓存
  • 3、网络缓存 其中,内存缓存应优先加载,它速度最快;本地缓存次优先加载,它速度也快;网络缓存不应该优先加载,它走网络,速度慢且耗流量。

最优-优先级:内存缓存 > 本地缓存 > 网络缓存

  • 两个方法实现:根据图片的url去加载图片、在本地和内存中缓存
  • 两个方法实现:设置本地缓存,以及获取本地缓存
  • 两个方法实现:设置内存缓存,获取内存缓存。

如果使用hashmap去存储图片时,当图片越来越多,那么会造成内存溢出,因为是强引用(对于强引用的系统不会回收)

如果改成软引用softReference,在android 2.3 以上的系统,对象会被提前回收。

可以用LruCache来解决上述内存不回收或提前回收的问题。least recentlly use 最少最近使用算法 它会将内存控制在一定的大小内, 超出最大值时会自动回收, 这个最大值开发者自己定。(这个东西没有用过..)

GLide图片加载方法

图片加载周期

Glide最简单的用法:

Glide.with(context).load(url).into(imageView)

with()方法中传入的Context实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

想法:传入ImageView.getContext()实例是不是最好的方案,ImageView所在的Context销毁了,图片自然应该取消加载。此方案是否可行?列表的回收机制会不会有问题?

结论:不是最好的方案,fragment和adapter中ImageView.getContext()返回的都是Activity,当fragment或adapter销毁但activity并没有销毁时,图片仍会加载,所以声明周期并不合理

图片格式(Bitmap,Gif)

Glide是支持加载GIF图片的,不需要编写额外的代码,Glide内部会自动判断图片格式(Gif图不一定是以.gif后缀结尾的哦。

当然也可以手动指定图片格式: 调用了asBitmap()方法,静态图正常加载,GIF图无法正常播放,会在界面上显示第一帧的图片; 调用了asGif()方法,GIF图正常加载和播放,静态图加载失败。

想法:一般情况下不需要指定图片格式,动图的播放机制(一直循环播放/只播放一次)怎么设置?默认是循环播放

结论:设置监听,回调中设置播放次数,如下:

 Glide.with(this)
    .load(url)
    .addListener(new RequestListener<Drawable>() {
      @Override
      public boolean onLoadFailed(
      @Nullable GlideException e, Object model,
      Target<Drawable> target, boolean isFirstResource) {
      return false;
    }
      @Override
      public boolean onResourceReady(Drawable resource,
      Object model, Target<Drawable> target,
      DataSource dataSource,
      boolean isFirstResource) {
      if (resource instanceof GifDrawable) {
        //设置播放次数
        ((GifDrawable) resource).setLoopCount(3);
      }
      return false;
    }
})
    .into(iv);

缓存

在缓存这一功能上,Glide又将它分成了两个模块,一个是内存缓存,一个是硬盘缓存。 默认情况下,Glide自动就是开启内存缓存和磁盘缓存的。 磁盘缓存是存在哪的?是否需要动态权限,未授权时磁盘缓存是不是就失效了?

结论:磁盘缓存默认存储在应用内部文件,访问应用内部文件无需动态申请权限

集成网络框架

Glide默认使用的是HttpUrlConnection,支持集成Volley,Okhttp等其它网络栈。 想法:一般用的时候没有集成过网络栈,如何集成?

权限

一般使用场景是加载网络图片,Internet权限肯定是要的,但还有个小细节:如果你正在从 URL 加载图片,Glide 可以自动帮助你处理片状网络连接:它可以监听用户的连接状态并在用户重新连接到网络时重启之前失败的请求。如果 Glide 检测到你的应用拥有 ACCESS_NETWORK_STATE 权限,Glide 将自动监听连接状态而不需要额外的改动。

占位符

  • placeHolder
  • error
  • fallback

占位图是否会影响控件的大小? 结论:不会,网上有人说会有问题,我用的Glide4.9版本试的,可能Glide已经修复了

淡入效果

transitionOption

变换

缩放模式适配不同场景:

启动页/广告页

全屏展示(填充宽高),不变形,尽可能少的裁剪内容[我特地问了做设计的朋友,他们是有设计规范的,四周不会放内容,xx像素内是内容区域。所以适当的裁剪掉边上的内容是没有问题的]。使用centerCrop就可满足上述条件。

banner

banner一般都是以ViewPager做容器,ViewPager的高度是不支持wrap_content的,也就是说要么指定高度,要么match_parent。banner的宽一般是固定的,高度若是写死,采用fitXY在有些手机上会有变形;fitCenter周边可能会有留白;centerCrop又会裁剪掉边上的内容 (banner一般要求不能裁剪,本来区域就不大,你还裁剪,可能会丢失重要内容)。

宽固定,高根据图片比例算出控件高,设置给ViewPager,因为viewPager会预加载两边的view,所以适配的前提是所有banner图片宽高比一致(一般都能满足)

Glide.with(context)
              .load(url)
              .addListener(new RequestListener<Drawable>() {
                  @Override
                  public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                      return false;
                  }
                  @Override
                  public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                  //根据图片宽高比设置容器的高度
                      int intrinsicWidth = resource.getIntrinsicWidth();
                      int intrinsicHeight = resource.getIntrinsicHeight();
                      int height = intrinsicHeight * width / intrinsicWidth;
                      layoutParams.height = height;
                      return false;
                  }
              })
              .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
              .transform(new RoundedCorners(10))
              .into(imageView);

固定宽高

图片不变形,不裁剪,fitCenter即可满足。

圆角

RoundedCorners

圆形

CircleCrop

不得不说Glide的设计真的满足了我们99%的场景需求了。

以上是许多大厂中喜欢使用的图片加载方法,这里简单的举例Glide图片加载的几种方案。其中阿里企业就是使用Glide图片加载。有关更多Android技术详解,和更多核心进阶技术。

总结

Glide是Android开发中常用的图片框架,其最基本用法例如Glide.with(context).load(url).into(imageView),我们沿着此链式调用的顺序一窥Glide图片加载流程的样貌。

一图胜千言

以上就是详解Android GLide图片加载常用几种方法的详细内容,更多关于Android GLide图片加载的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android Glide常见使用方式讲解

    目录 效果图 依赖 普通显示 占位符显示 圆角显示 高斯模糊显示 生命周期 图床工具推荐 效果图 依赖 implementation 'com.github.bumptech.glide:glide:4.13.0'    annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'    implementation 'jp.wasabeef:glide-transformations:4.1.0' 普通显示 没有任何附加效果显示

  • Android中如何使用Glide加载图像

    在进入 Glide 示例之前,我们应该知道什么是 glide,Glide 是 muyangmin 开发的一个图像处理库.使用 glide 库,我们可以显示图像.解码图像.缓存图像.动画 gif 等等. 这个例子演示了如何在 android 中集成 glide. 第 1 步- 在 Android Studio 中创建一个新项目,转到 File ⇒ New Project 并填写所有必需的详细信息以创建一个新项目. 第 2 步- 在 build.gradle(Module:app)中添加以下代码.

  • Android Glide 4.0+使用详解

    下载和设置 Android SDK 要求 使用最低要求 - 使用 Glide 要求 SDK 版本为 API 14 (Ice Cream Sandwich) 及以上. 编译最低要求 - 编译 Glide 要在 SDK 版本为 API 26 (Oreo) 及以上. jar 你可以直接在 GitHub下载最新的jar包 Gradle 如果使用 Gradle,可从 Maven Central 或 JCenter 中添加对 Glide 的依赖.同样,你还需要添加 Android 支持库的依赖. repos

  • Android项目实战之Glide 高斯模糊效果的实例代码

    核心需要高斯模糊的库 compile 'jp.wasabeef:glide-transformations:2.0.1' 针对于3.7的版本 使用方法为: //加载背景, Glide.with(MusicPlayerActivity.this) .load(service.getImageUri()) .dontAnimate() .error(R.drawable.no_music_rotate_img) // 设置高斯模糊,模糊程度(最大25) 缩放比例 .bitmapTransform(n

  • Android图片加载库Glide用法

    目录 Glide介绍 Android SDK 要求 使用前的准备 基本用法 在 ListView 和 RecyclerView 中的使用 占位符 选项 过渡动画 变换效果 使用示例 Glide介绍 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动.Glide提供了易用的API,高性能.可扩展的图片解码管道,以及自动的资源池技术.Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快.更平滑. Android SDK 要求 Min Sdk Version - 使用

  • Android图片框架Glide原理深入探索

    目录 with load into 原理总结 缓存 LruCache 首先引入依赖 implementation 'com.github.bumptech.glide:glide:4.12.0'    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' 下面一行代码,就是Glide最简单的使用方式了 Glide.with(this).load(url).into(imageView) with 首先,我们来看with,其

  • Android如何使用Glide加载清晰长图

    最近项目中使用的是Glide加载图片,上线后用户反馈图片模糊,经过测试后发现是用户点击超长图放大的时候,图片变的模糊看不起,这很影响用户的体验,要解决这个问题,我们需要先充分的了解Glide的使用. Glide概述 使用习惯Glide3的朋友总会觉得Glide 4相对于Glide 3改动非常大,其实不然.之所以大家会有这种错觉,是因为你将Glide 3的用法直接搬到Glide 4中去使用,结果IDE全面报错,然后大家可能就觉得Glide 4的用法完全变掉了. 其实Glide 4相对于Glide

  • Android 使用Glide加载网络图片等比例缩放的实现方法

    在做android图片加载的时候,由于手机屏幕受限,很多大图加载过来的时候,我们要求等比例缩放,比如按照固定的宽度,等比例缩放高度,使得图片的尺寸比例得到相应的缩放,但图片没有变形.显然按照android:scaleType不能实现,因为会有很多限制,所以必须要自己写算法. 通过Glide来缩放 其实glide提供了这样的方法.具体是显示继承Transformation 的 setResource 方法. (1) 先获取网络或本地图片的宽高 (2) 获取需要的目标宽 (3) 按比例得到目标的高度

  • 详解Android GLide图片加载常用几种方法

    目录 缓存浅析 GLide图片加载方法 图片加载周期 图片格式(Bitmap,Gif) 缓存 集成网络框架 权限 占位符 淡入效果 变换 启动页/广告页 banner 固定宽高 圆角 圆形 总结 缓存浅析 为啥要做缓存? android默认给每个应用只分配16M的内存,所以如果加载过多的图片,为了 防止内存溢出 ,应该将图片缓存起来. 图片的三级缓存分别是: 1.内存缓存 2.本地缓存 3.网络缓存 其中,内存缓存应优先加载,它速度最快:本地缓存次优先加载,它速度也快:网络缓存不应该优先加载,它

  • 详解Android之图片加载框架Fresco基本使用(一)

    PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中设置属性的相关用法. 0.引入Fresco以及相关注意事项. 1.PlaceHolderImage占位图 2.FailureImage加载失败时显示的图片 3.RetryImage重新加载的图片 4.ProgressBarImage加载时显示的进度图片 5.BackgroundImage背景图 6.

  • 详解Android之图片加载框架Fresco基本使用(二)

    PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,PostProcesser,Image Request 4.渐进式JPEG与动图的显示 最近这两天把Fresco的官方文档算是看了个差不多,就剩下Fresco的基本原理还有结合okHttp等类库如何使用的问题,虽然官方文档给出的功能比较的多,比如说自定义View,缩略图显示等等,这些我也基本就看了个大概,觉

  • Android Glide图片加载(加载监听、加载动画)

    本文实例为大家分享了Android Glide图片加载的具体代码,供大家参考,具体内容如下 1.普通用法 Glide.with(context) .load(url) .into(view); with中可以放context.activity.fragment..:当放activity.fragment时glide会根据生命周期来加载图片.推荐使用activity. 2.设置加载中和加载失败的图片 Glide.with(context) .load(url) .placeholder(R.dra

  • 详解Django模版中加载静态文件配置方法

    1.settings.INSTALLED_APPS下添加:django.contrib.staticfiles 2.settings.py下添加:STATIC_URL = '/static/' 3. (1)在APP下新建文件夹static,然后在这个static文件夹下创建一个当前APP的名字的文件夹,再把静态文件放到这个文件夹下:(类似于Templates配置) 在模板中这样调用: {% load static %} <img src="{% static 'front/logo.jpg

  • 详解android 用webview加载网页(https和http)

    1.Android 加载https请求的网页的时候 打不开 当load有ssl层的https页面时,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,而并不会像PC浏览器中那样跳出一个风险提示框.因此,我们必须针对这种情况进行处理.(这个证书限于2.1版本以上的Android 系统才可以) wv.setWebViewClient(new WebViewClient(){ @override public void onReceivedSslError(WebV

  • 详解Android中图片的三级缓存及实例

    详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

  • Android Fresco图片加载优化的方案

    优化背景 一般情况下,Fresco图片加载需使用SimpleDraweeView,这个控件并不能自动根据自身的尺寸按需加载图片,即一个 N×N 的UI控件,背后加载的实际图片可能是 2N×2N.这就导致了实际应用运行过程中的内存使用效率不高,需要针对其进行内存优化. 在一些入门级硬件设备上,表现得尤为明显,随着程序的运行时间的增长,OOM的风险也不断加大. Fresco版本:1.13.0 数据记录 声明控件大小为 480×270 <com.facebook.drawee.view.SimpleD

  • android中图片加载到内存的实例代码

    本文演示android中图片加载到内存 首先设计界面: 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="matc

  • Android编程图片加载类ImageLoader定义与用法实例分析

    本文实例讲述了Android编程图片加载类ImageLoader定义与用法.分享给大家供大家参考,具体如下: 解析: 1)图片加载使用单例模式,避免多次调用时产生死锁 2)核心对象 LruCache 图片加载时先判断缓存里是否有图片,如果有,就使用缓存里的 没有就加载网络的,然后置入缓存 3)使用了线程池ExecutorService mThreadPool技术 4)使用了Semaphore 信号来控制变量按照先后顺序执行,避免空指针的问题 如何使用: 在Adapter里加载图片时 复制代码 代

随机推荐