热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidglide简书,Android图片处理之Glide4.0版本

老婆保佑,代码无BUG前言一般项目我都会使用Glide作为我的图片加载框架,他和Picasso,真的很像,郭大神早就分析过了,

9db8f314b286

老婆保佑,代码无BUG

前言

一般项目我都会使用Glide作为我的图片加载框架,他和Picasso ,真的很像,郭大神早就分析过了,很详细,这里也就简单做个记录。小白白一枚,学习路上

目录

一:GitHub

二:下载使用

Gradle

Android SDK 要求

解决方案

3.权限

二:apply && RequestOptions

三:API 介绍

四: 补充说明

diskCacheStrategy参数补充

asBitmap()注意坑

submit()

transforms

(1) 转成黑白

(2) 高斯模糊

(3) 圆形

(4 ) 圆角

5.Generated API

一:GitHub

点击,跳转到官网,介绍很详细

1. Gradle

repositories {

mavenCentral()

maven { url 'https://maven.google.com' }

}

dependencies {

compile 'com.github.bumptech.glide:glide:4.4.0'

annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'

}

2. Android SDK 要求

Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 (Ice Cream Sandwich) 或更高。

Compile Sdk Version - Glide 必须使用 API 26 (Oreo) 或更高版本的 SDK 来编译。

Support Library Version - Glide 使用的支持库版本为 27。

否则会出现如下异常

9db8f314b286

解决方案

dependencies {

implementation 'com.android.support:appcompat-v7:27.0.2' //这个版本的就可以了

implementation 'com.github.bumptech.glide:glide:4.4.0'

annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'

}

3.权限

二:apply && RequestOptions

4.0之前最常用的方式,当然现在也是哈

Glide.with(this)

.load(url)

.into(img);

4.0之后,有一个新的东西

Glide.with(this)

.load(url)

// .apply(RequestOptions options)

.into(img);

比如 我们加载占位图和错误图

RequestOptions optiOns= new RequestOptions()

.error(R.drawable.error)

.placeholder(R.drawable.loading);

Glide.with(this)

.load(url)

.apply(options)

.into(imageView);

小伙伴们没看错,这样的方式,摆脱了,以前链式写法中,Glide很长很长,现在的话,我们可以传入一个RequestOptions,对象,就有小伙伴问了,有啥用,我觉得,比较容易封装,

例如

public class GlideUtil {

public static void load(Context context,

String url,

ImageView imageView,

RequestOptions options) {

Glide.with(context)

.load(url)

.apply(options)

.into(imageView);

}

}

三:API 介绍

API

介绍

当请求正在执行时被展示的 Drawable

请求永久性失败时展示

在请求的url/model为 null 时展示

override

指定了一个图片的尺寸,Target.SIZE_ORIGINAL加载图片的原始尺寸

skipMemoryCache(true)

禁用内存缓存功能

diskCacheStrategy(DiskCacheStrategy.NONE)

禁用硬盘缓存功能,参数列表如下 四(1)

asBitmap()

只允许加载静态图片,。如果传入的是GIF图,会展示GIF图的第一帧

asFile()

指定文件格式 注意事项 如下 四(2)

asDrawable()

指定Drawable格式

submit()

使用如下四(3)

transforms

图片变换,Glide 默认有3个,如下四(4)

四: 补充说明

1. diskCacheStrategy参数补充

参数

说明

DiskCacheStrategy.NONE

表示不缓存任何内容。

DiskCacheStrategy.DATA

表示只缓存原始图片。

DiskCacheStrategy.RESOURCE

表示只缓存转换过后的图片。

DiskCacheStrategy.ALL

表示既缓存原始图片,也缓存转换过后的图片。

DiskCacheStrategy.AUTOMATIC

表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。

2. asBitmap()注意坑

熟悉Glide 3的朋友对asBitmap()方法肯定不会陌生对吧?但是千万不要觉得这里就没有陷阱了,在Glide 3中的语法是先load()再asBitmap()的,而在Glide 4中是先asBitmap()再load()的。乍一看可能分辨不出来有什么区别,但如果你写错了顺序就肯定会报错了

3. submit()

通过如下代码,可以获取到,下载好的图片放在哪,可以看到 都在cache下

new Thread(new Runnable() {

@Override

public void run() {

try {

File file = Glide.with(MainActivity.this)

.asFile()

.load(url)

.submit()

.get();

Log.e("Tag", "path-->" + file.getPath());

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

}).start();

E/Tag: path-->/data/user/0/com.allens.glidedemo/cache/image_manager_disk_cache/309df01e6362ddc8939a4e3c549e8276dffb0446a89f2facee371909301fe76a.0

4. transforms

内置有这3个

RequestOptions optiOns= new RequestOptions()

.centerCrop();

RequestOptions optiOns= new RequestOptions()

.fitCenter();

RequestOptions optiOns= new RequestOptions()

.circleCrop();//圆形

一般我们还会自己去定义,以下是常用的3种转换

使用起来也很简单

RequestOptions optiOns= new RequestOptions()

.skipMemoryCache(true)

.diskCacheStrategy(DiskCacheStrategy.NONE);

//圆形

.transforms(new CircleTransform(mContext,2, Color.DKGRAY))//外圈宽度,外圈颜色

//黑白

.transforms(new BlackWhiteTransformation());

//高斯模糊 范围在 0 -- 25 越大模糊程度越高

.transforms(new BlurTransformation(mContext, 25)); // (0

//可以使用多种

.transforms(new BlurTransformation(mContext, 25),new CircleTransform(mContext,2, Color.DKGRAY))

(1) 转成黑白

package com.allens.lib_glide.Transformation;

import android.graphics.Bitmap;

import android.media.ThumbnailUtils;

import android.support.annotation.NonNull;

import android.view.animation.Transformation;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;

import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;

import java.security.MessageDigest;

/**

* 描述:

*

黑白

* Created by allens on 2018/1/8.

*/

public class BlackWhiteTransformation extends BitmapTransformation {

@Override

protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {

return convertToBlackWhite(toTransform);

}

@Override

public void updateDiskCacheKey(MessageDigest messageDigest) {

}

private Bitmap convertToBlackWhite(Bitmap bmp) {

int width = bmp.getWidth(); // 获取位图的宽

int height = bmp.getHeight(); // 获取位图的高

int[] pixels = new int[width * height]; // 通过位图的大小创建像素点数组

bmp.getPixels(pixels, 0, width, 0, 0, width, height);

int alpha = 0xFF <<24;

for (int i = 0; i

for (int j = 0; j

int grey = pixels[width * i + j];

//分离三原色

int red = ((grey & 0x00FF0000) >> 16);

int green = ((grey & 0x0000FF00) >> 8);

int blue = (grey & 0x000000FF);

//转化成灰度像素

grey = (int) (red * 0.3 + green * 0.59 + blue * 0.11);

grey = alpha | (grey <<16) | (grey <<8) | grey;

pixels[width * i + j] = grey;

}

}

//新建图片

Bitmap newBmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);

//设置图片数据

newBmp.setPixels(pixels, 0, width, 0, 0, width, height);

Bitmap resizeBmp = ThumbnailUtils.extractThumbnail(newBmp, 380, 460);

return resizeBmp;

}

}

(2)高斯模糊

package com.allens.lib_glide.Transformation;

import android.annotation.TargetApi;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.os.Build;

import android.renderscript.Allocation;

import android.renderscript.Element;

import android.renderscript.RSRuntimeException;

import android.renderscript.RenderScript;

import android.renderscript.ScriptIntrinsicBlur;

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 allens on 2018/1/8.

*/

public class BlurTransformation extends BitmapTransformation {

private Context context;

private float blurRadius;

public BlurTransformation(Context context, float blurRadius) {

this.cOntext= context;

this.blurRadius = blurRadius;

}

@Override

protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {

return blurBitmap(context, toTransform, blurRadius, outWidth, outHeight);

}

@Override

public void updateDiskCacheKey(MessageDigest messageDigest) {

}

/**

* @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;

}

}

(3) 圆形

package com.allens.lib_glide.Transformation;

import android.content.Context;

import android.content.res.Resources;

import android.graphics.Bitmap;

import android.graphics.BitmapShader;

import android.graphics.Canvas;

import android.graphics.Paint;

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 allens on 2018/1/8.

*/

public class CircleTransform extends BitmapTransformation {

private Paint mBorderPaint;

private float mBorderWidth;

public CircleTransform(Context context) {

super(context);

}

public CircleTransform(Context context, int borderWidth, int borderColor) {

super(context);

mBorderWidth = Resources.getSystem().getDisplayMetrics().density * borderWidth;

mBorderPaint = new Paint();

mBorderPaint.setDither(true);

mBorderPaint.setAntiAlias(true);

mBorderPaint.setColor(borderColor);

mBorderPaint.setStyle(Paint.Style.STROKE);

mBorderPaint.setStrokeWidth(mBorderWidth);

}

@Override

protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {

return circleCrop(pool, toTransform);

}

@Override

public void updateDiskCacheKey(MessageDigest messageDigest) {

}

private Bitmap circleCrop(BitmapPool pool, Bitmap source) {

if (source == null) {

return null;

}

int size = (int) (Math.min(source.getWidth(), source.getHeight()) - (mBorderWidth / 2));

int x = (source.getWidth() - size) / 2;

int y = (source.getHeight() - size) / 2;

Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);

if (result == null) {

result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);

}

Canvas canvas = new Canvas(result);

Paint paint = new Paint();

paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

paint.setAntiAlias(true);

float r = size / 2f;

canvas.drawCircle(r, r, r, paint);

if (mBorderPaint != null) {

float borderRadius = r - mBorderWidth / 2;

canvas.drawCircle(r, r, borderRadius, mBorderPaint);

}

return result;

}

}

4.0 圆角

package com.starot.spark.transformation;

import android.content.Context;

import android.content.res.Resources;

import android.graphics.Bitmap;

import android.graphics.BitmapShader;

import android.graphics.Canvas;

import android.graphics.Paint;

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;

/**

* 描述:

*

圆形

*

* @author allens

* @date 2018/1/8

*/

public class CircleTransform extends BitmapTransformation {

private Paint mBorderPaint;

private float mBorderWidth;

public CircleTransform(Context context) {

super(context);

}

public CircleTransform(Context context, int borderWidth, int borderColor) {

super(context);

mBorderWidth = Resources.getSystem().getDisplayMetrics().density * borderWidth;

mBorderPaint = new Paint();

mBorderPaint.setDither(true);

mBorderPaint.setAntiAlias(true);

mBorderPaint.setColor(borderColor);

mBorderPaint.setStyle(Paint.Style.STROKE);

mBorderPaint.setStrokeWidth(mBorderWidth);

}

@Override

protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {

return circleCrop(pool, toTransform);

}

@Override

public void updateDiskCacheKey(MessageDigest messageDigest) {

}

private Bitmap circleCrop(BitmapPool pool, Bitmap source) {

if (source == null) {

return null;

}

int size = (int) (Math.min(source.getWidth(), source.getHeight()) - (mBorderWidth / 2));

int x = (source.getWidth() - size) / 2;

int y = (source.getHeight() - size) / 2;

Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);

if (result == null) {

result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);

}

Canvas canvas = new Canvas(result);

Paint paint = new Paint();

paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

paint.setAntiAlias(true);

float r = size / 2f;

canvas.drawCircle(r, r, r, paint);

if (mBorderPaint != null) {

float borderRadius = r - mBorderWidth / 2;

canvas.drawCircle(r, r, borderRadius, mBorderPaint);

}

return result;

}

}

5.Generated API

如果4.0用的不爽,就想使用3.0版本的那种链式写法,将Glide 关键字改成

GlideApp即可

GlideApp.with(this)

.load(url)

.placeholder(R.drawable.loading)

.error(R.drawable.error)

.skipMemoryCache(true)

.diskCacheStrategy(DiskCacheStrategy.NONE)

.override(Target.SIZE_ORIGINAL)

.circleCrop()

.into(imageView);



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
author-avatar
手机用户2502880041
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有