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 支持库的依赖。

repositories {
 mavenCentral()
 maven { url 'https://maven.google.com' }
}
dependencies {
  compile 'com.github.bumptech.glide:glide:4.1.1'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
}

Kotlin

如果你在 Kotlin 编写的类里使用 Glide 注解,你需要引入一个 kapt 依赖,以代替常规的 annotationProcessor 依赖:

dependencies {
 kapt 'com.github.bumptech.glide:compiler:4.1.1'
}

开始使用

基本用法

加载图片

Glide.with(fragment)
  .load(myUrl)
  .into(imageView);

取消加载图片

Glide.with(fragment).clear(imageView);

在RecyclerView 中使用

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
  String url = urls.get(position);
  Glide.with(fragment)
    .load(url)
    .into(holder.imageView);
}

加载占位图

加载过程中的占用(Placeholder)

Glide.with(fragment)
 .load(url)
 .placeholder(R.drawable.placeholder)
 .into(view);

加载失败后显示的图片(Error)

Glide.with(fragment)
 .load(url)
 .error(R.drawable.error)
 .into(view);

图片的转换

Glide中的大部分设置项都可以通过 RequestOptions 类和 apply() 方法来应用到程序中。 使用 request options 可以实现(包括但不限于):

  1. 占位图(Placeholders)
  2. 转换(Transformations)
  3. 缓存策略(Caching Strategies)
  4. 组件特有的设置项,例如编码质量,或Bitmap的解码配置等。

加载圆形图片

 Glide.with(this)
        .load(url)
        .apply(RequestOptions.circleCropTransform())
        .into(ivTest);

加载图片带淡入淡出的动画效果

 Glide.with(this)
        .load(url)
        .transition(withCrossFade())
        .into(ivTest);

等等很多的转换效果,具体自己可以一个一个试试
缓存

Glide的默认缓存策略是AUTOMATIC,
在磁盘缓存

GlideApp.with(fragment)
 .load(url)
 .diskCacheStrategy(DiskCacheStrategy.ALL)
 .into(imageView);

仅从缓存加载图片

GlideApp.with(fragment)
 .load(url)
 .onlyRetrieveFromCache(true)
 .into(imageView);

跳过内存缓存

GlideApp.with(fragment)
 .load(url)
 .skipMemoryCache(true)
 .into(view);

跳过磁盘缓存

GlideApp.with(fragment)
 .load(url)
 .diskCacheStrategy(DiskCacheStrategy.NONE)
 .into(view);

跳过所有的缓存

GlideApp.with(fragment)
 .load(url)
 .diskCacheStrategy(DiskCacheStrategy.NONE)
 .skipMemoryCache(true)
 .into(view);

清理磁盘的缓存

Glide.get(applicationContext).clearDiskCache();

高级用法

加载一个图片为高斯模糊效果

使用方法

代码如下:

Glide.with(getActivity()).load("http://img1.imgtn.bdimg.com/it/u=594559231,2167829292&fm=27&gp=0.jpg").apply(RequestOptions.bitmapTransform(new GlideBlurformation(getActivity()))).into(ivTest);

用到的其他工具类

package com.qiezzi.clinic.chengqi.common.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import java.security.MessageDigest;
/**
 * Created by yukuoyuan on 2017/9/29.
 */
public class GlideBlurformation extends BitmapTransformation {
  private Context context;
  public GlideBlurformation(Context context) {
    this.context = context;
  }
  @Override
  protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
    return BlurBitmapUtil.instance().blurBitmap(context, toTransform, 20,outWidth,outHeight);
  }
  @Override
  public void updateDiskCacheKey(MessageDigest messageDigest) {
  }
}
package com.qiezzi.clinic.chengqi.common.utils;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
/**
 * Created by yukuoyuan on 2017/9/29.
 */
public class BlurBitmapUtil {
  private static BlurBitmapUtil sInstance;
  private BlurBitmapUtil() {
  }
  public static BlurBitmapUtil instance() {
    if (sInstance == null) {
      synchronized (BlurBitmapUtil.class) {
        if (sInstance == null) {
          sInstance = new BlurBitmapUtil();
        }
      }
    }
    return sInstance;
  }
  /**
   * @param context  上下文对象
   * @param image   需要模糊的图片
   * @param outWidth 输入出的宽度
   * @param outHeight 输出的高度
   * @return 模糊处理后的Bitmap
   */
  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
  public Bitmap blurBitmap(Context context, Bitmap image, float blurRadius, int outWidth, int outHeight) {
    // 将缩小后的图片做为预渲染的图片
    Bitmap inputBitmap = Bitmap.createScaledBitmap(image, outWidth, outHeight, false);
    // 创建一张渲染后的输出图片
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
    // 创建RenderScript内核对象
    RenderScript rs = RenderScript.create(context);
    // 创建一个模糊效果的RenderScript的工具对象
    ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    // 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间
    // 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去
    Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
    Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
    // 设置渲染的模糊程度, 25f是最大模糊度
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
      blurScript.setRadius(blurRadius);
    }
    // 设置blurScript对象的输入内存
    blurScript.setInput(tmpIn);
    // 将输出数据保存到输出内存中
    blurScript.forEach(tmpOut);
    // 将数据填充到Allocation中
    tmpOut.copyTo(outputBitmap);
    return outputBitmap;
  }
}

具体其他效果就自己写吧,其实原理很简单,就是通过继承BitmapTransformation接口,然后在里边把bitmap处理为自己想要的效果.没有什么过于复杂的过程.

参考资料 : Glide官方文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android基于Glide v4.x的图片加载进度监听
(0)

相关推荐

  • Android基于Glide v4.x的图片加载进度监听

    Glide是一款优秀的图片加载框架,简单的配置便可以使用起来,为开发者省下了很多的功夫.不过,它没有提供其加载图片进度的api,对于这样的需求,实现起来还真颇费一番周折. 尝试 遇到这个需求,第一反应是网上肯定有人实现过,不妨借鉴一下别人的经验. Glide加载图片实现进度条效果 可惜,这个实现是基于3.7版本的,4.0版本以上的glide改动比较大,using函数已经被移除了 using() The using() API was removed in Glide 4 to encourage

  • 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中Lifecycle的原理详解

    目录 一.基本使用 二.LifecycleObserver接口和LifecycleOwner接口 三.getLifecycle() 四.绑定生命周期 总结 Lifecycle是Android Architecture Components的成员,是一个生命周期感知组件,能够感知Activity.Fragment等组件的生命周期变化,并将变化通知到已注册的观察者.正确的使用有助于更好地组织代码,减少内存泄漏,增强稳定.下面分析他的实现原理,看看到底只怎么感知生命周期的. 一.基本使用 1.引入依赖

  • Android NavigationController 右滑手势详解

    苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecognizer.enabled = YES; 这个api功能就是在NavigationController堆栈内的UIViewController可以支持右滑手势,也就是不用点击右上角的返回按钮,轻轻在屏幕左边一滑,屏幕就会返回,随着ios设备屏幕的增大,这个小功能让手指短,拇指大和手残人士看到了福音. 这

  • Android的搜索框架实例详解

    基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

  • Android中ContentProvider和ContentResolver详解

    Android中ContentProvider和ContentResolver详解 在Android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法: 1)AIDL 2)Broadcast 3)ContentProvider. 使用AIDL需要我们编写AIDL接口以及实现,而且对方也要有相应的接口描述,有点麻烦:使用Broadcast,我们不需要任何接口描述,只要协议文档就可以了,但是有点不好就是,这种方式不直接而且是异步的:使用ContentProvider我们不需要接口描述,只

  • Android DaggerActivityComponent错误解决办法详解

    Android DaggerActivityComponent错误解决办法详解 在使用dagger2的过程中,如果修改了某个类的内容,第一次编译运行时总会报错:错误: 找不到符号 符号: 类 DaggerActivityComponent 位置: 程序包 com--的错误,然后再重新编译一次,才会正常运行,经过仔细的检查终于找到问题的根源: 错误的原因是build.gradle(Module:app)引入'com.google.dagger:dagger-compiler:2.0.2'使用的是c

  • Android pdf viewer在android studio应用问题说明详解

    之前一直是做.NET开发的,最近需要弄一个新闻app,能力有限,只能借助HTML5 WebAPP+android studio来完成这项工作. android studio主要用WebView来加载发布好的WebApp,打包生产APP. 其中由于显示一些pdf文档,所以研究了一下,记录一下心得,同时也希望帮助到新手们. android 显示网络pdf,基本原理:先将pdf文件通过DownloadManager下载到手机sdk某个文件夹中,然后通过android-pdf-viewer插件进行显示.

  • Android中SQLite 使用方法详解

    Android中SQLite 使用方法详解 现在的主流移动设备像android.iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧.对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取. 下面就向大家介绍一下SQLite常用的操作方法,为了方便,我将代码写在了Activity的onCreate中: @Ov

  • Android 中 ActivityLifecycleCallbacks的实例详解

    Android 中 ActivityLifecycleCallbacks的实例详解           以上就是使用ActivityLifecycleCallbacks的实例,代码注释写的很清楚大家可以参考下, MyApplication如下: package com.cc; import java.util.LinkedList; import android.app.Activity; import android.app.Application; import android.os.Bun

  • Android IPC机制Messenger实例详解

    Android IPC机制Messenger实例详解 前言: Messenger可以翻译成信使,通过它可以在不同进程间传递Message对象有了它就可以轻松实现进程间的数据传递了. Messenger使用的方法相对AIDL比较简单,它对AIDL做了一层封装是的我们不需要像采用AIDL那样去实现进程通信那么麻烦,可以看看他的源码有AIDL的迹象. public final class Messenger implements Parcelable { private final IMessenge

随机推荐