前言:

这一节里面我们将讲到关于Glide的图片的剪裁

Glide 系列目录

  • 1.Glide-入门教程
  • 2.Glide-占位图以及加载动画
  • 3.Glide-加载本地图片
  • 4.Glide-加载Gif
  • 5.Glide-绑定生命周期
  • 6.Glide-内存缓存与磁盘缓存
  • 7.Glide-通过Modules定制Glide
  • 8.Glide-自定义缓存
  • 9.Glide-图片的压缩
  • 10.Glide-图片预处理(圆角,高斯模糊等)
  • 11.Glide-图片的剪裁(ScaleType)
  • 12.Glide-源码详解

1.基础知识

这里会涉及到Glide的变换处理transform,在之前的文章中已经讲过了,这里就不做介绍了,没有看过的朋友最好去了解一下,不然接下来的分析可能会理解不了

Glide-图片预处理(transform)
http://blog.csdn.net/yulyu/article/details/55261351

2.ImageView默认的ScaleType

讲到图片的剪裁,我们首先要介绍一下ImageView默认的ScaleType设置效果

ImageView的ScaleType一共有8种属性:

  • matrix
  • center
  • centerInside
  • centerCrop
  • fitCenter(默认)
  • fitStart
  • fitEnd
  • fitXY
有些文章说默认是matrix,是不正确的,其实默认是FIT_CENTER

可以通过ImageView的源码看到默认设置

private void initImageView() {mMatrix = new Matrix();mScaleType = ScaleType.FIT_CENTER;if (!sCompatDone) {final int targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;sCompatAdjustViewBounds = targetSdkVersion <= Build.VERSION_CODES.JELLY_BEAN_MR1;sCompatUseCorrectStreamDensity = targetSdkVersion > Build.VERSION_CODES.M;sCompatDrawableVisibilityDispatch = targetSdkVersion < Build.VERSION_CODES.N;sCompatDone = true;}
}

2.1属性介绍

(1)matrix

不缩放 ,图片与控件 左上角 对齐,当图片大小超过控件时将被 裁剪

(2)center

不缩放 ,图片与控件 中心点 对齐,当图片大小超过控件时将被 裁剪

(3)centerInside

以完整显示图片为目标, 不剪裁 ,当显示不下的时候将缩放,能够显示的情况下不缩放**

(4)centerCrop

以填满整个控件为目标,等比缩放,超过控件时将被 裁剪 ( 宽高都要填满 ,所以只要图片宽高比与控件宽高比不同时,一定会被剪裁)

(5)fitCenter(默认)

自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,居中显示

(6)fitStart

自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,靠左(上)显示

(7)fitEnd

自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,靠右(下)显示

(8)fitXY

以填满整个控件为目标, 不按比例 拉伸或缩放(可能会变形), 不剪裁

2.2效果图

当你不使用Glide,直接在ImageView的xml的src中设置图片效果如下

图片 336 * 448
控件 300 * 300

3.Glide配置

Glide有两个方法可以设置图片剪裁的策略

fitCenter()

centerCrop()

这两个方法其实都是通过调用transform方法来对图片进行处理

3.1默认策略

当你没有调用上述两个方法,并且也没有调用transform方法的时候,在Glide调用into方法时,会根据你设置的ScaleType来做处理

if (!isTransformationSet && view.getScaleType() != null) {switch (view.getScaleType()) {case CENTER_CROP:applyCenterCrop();break;case FIT_CENTER:case FIT_START:case FIT_END:applyFitCenter();break;//$CASES-OMITTED$default:// Do nothing.}
}

applyCenterCrop其实还是调用的centerCrop

applyFitCenter其实还是调用的applyFitCenter

通过默认的配置加载图片

Glide.with(this).load(url).into(iv1);

效果如下(跟ImageView设置src一样)

3.2 fitCenter

内部是调用transform方法来处理的,处理代码这边只是展示一下,就不做详细的介绍了,有兴趣的朋友可以研究

public static Bitmap fitCenter(Bitmap toFit, BitmapPool pool, int width, int height) {if (toFit.getWidth() == width && toFit.getHeight() == height) {if (Log.isLoggable(TAG, Log.VERBOSE)) {Log.v(TAG, "requested target size matches input, returning input");}return toFit;}final float widthPercentage = width / (float) toFit.getWidth();final float heightPercentage = height / (float) toFit.getHeight();final float minPercentage = Math.min(widthPercentage, heightPercentage);// take the floor of the target width/height, not round. If the matrix// passed into drawBitmap rounds differently, we want to slightly// overdraw, not underdraw, to avoid artifacts from bitmap reuse.final int targetWidth = (int) (minPercentage * toFit.getWidth());final int targetHeight = (int) (minPercentage * toFit.getHeight());if (toFit.getWidth() == targetWidth && toFit.getHeight() == targetHeight) {if (Log.isLoggable(TAG, Log.VERBOSE)) {Log.v(TAG, "adjusted target size matches input, returning input");}return toFit;}Bitmap.Config config = getSafeConfig(toFit);Bitmap toReuse = pool.get(targetWidth, targetHeight, config);if (toReuse == null) {toReuse = Bitmap.createBitmap(targetWidth, targetHeight, config);}// We don't add or remove alpha, so keep the alpha setting of the Bitmap we were given.TransformationUtils.setAlpha(toFit, toReuse);if (Log.isLoggable(TAG, Log.VERBOSE)) {Log.v(TAG, "request: " + width + "x" + height);Log.v(TAG, "toFit:   " + toFit.getWidth() + "x" + toFit.getHeight());Log.v(TAG, "toReuse: " + toReuse.getWidth() + "x" + toReuse.getHeight());Log.v(TAG, "minPct:   " + minPercentage);}Canvas canvas = new Canvas(toReuse);Matrix matrix = new Matrix();matrix.setScale(minPercentage, minPercentage);Paint paint = new Paint(PAINT_FLAGS);canvas.drawBitmap(toFit, matrix, paint);return toReuse;}

通过fitCenter的配置加载图片

Glide.with(this).load(url).fitCenter().into(iv1);

效果图:

3.3 centerCrop

跟fitCenter的原理一样,只是具体处理逻辑不一样

public static Bitmap centerCrop(Bitmap recycled, Bitmap toCrop, int width, int height) {if (toCrop == null) {return null;} else if (toCrop.getWidth() == width && toCrop.getHeight() == height) {return toCrop;}// From ImageView/Bitmap.createScaledBitmap.final float scale;float dx = 0, dy = 0;Matrix m = new Matrix();if (toCrop.getWidth() * height > width * toCrop.getHeight()) {scale = (float) height / (float) toCrop.getHeight();dx = (width - toCrop.getWidth() * scale) * 0.5f;} else {scale = (float) width / (float) toCrop.getWidth();dy = (height - toCrop.getHeight() * scale) * 0.5f;}m.setScale(scale, scale);m.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));final Bitmap result;if (recycled != null) {result = recycled;} else {result = Bitmap.createBitmap(width, height, getSafeConfig(toCrop));}// We don't add or remove alpha, so keep the alpha setting of the Bitmap we were given.TransformationUtils.setAlpha(toCrop, result);Canvas canvas = new Canvas(result);Paint paint = new Paint(PAINT_FLAGS);canvas.drawBitmap(toCrop, m, paint);return result;
}
Glide.with(this).load(url).centerCrop().into(iv2);

效果图(所有的都是与centerCrop效果一样):

4.其他

有一点要注意的就是fitCenter和centerCrop方法与transform方法可以共存,但是有时候会互相影响,如果说圆角处理遇到了剪裁,圆角那一部分可能会刚好被剪裁掉了

这一章节涉及到的主要是取图方面的知识,如果是对取图方面要求不高的项目,那么用原生的scaletpye或者是Glide提供的两个方法即可,但是如果是取图规则特别复杂的项目(比如我现在的项目(┬_┬)),那么就需要通过自定义transform了,具体可以参考Glide的两个transform的处理,也可以用github上不错的三方库

热门文章推荐

FaceBook推出的调试神器

Glide-图片的剪裁(ScaleType)相关推荐

  1. Android Glide图片加载框架(二)源码解析之into()

    文章目录 一.前言 二.源码解析 1.into(ImageView) 2.GlideContext.buildImageViewTarget() 3.RequestBuilder.into(Targe ...

  2. Glide图片框架使用详细介绍(一)

    一.背景介绍 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开源项目中,包括2014年google I/O ...

  3. Android Glide图片加载框架(四)回调与监听

    文章目录 Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源码解析之with() Android Gl ...

  4. Android Glide图片加载框架(三)缓存机制

    文章目录 一.缓存简介 二.缓存用法 内存缓存方式 磁盘缓存方式 三.缓存KEY 四.内存缓存 内存缓存流程 五.磁盘缓存 磁盘缓存流程 Android Glide图片加载框架系列文章 Android ...

  5. Android Glide图片加载框架(二)源码解析之load()

    文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...

  6. Android Glide图片加载框架(二)源码解析之with()

    文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...

  7. Android Glide图片加载框架(一)基本用法

    文章目录 一.前言 二.简介 三.基本用法 第一步:调用 Glide.with() 方法创建加载图片的实例 第二步:调用 load() 方法指定待加载的图片资源 第三步:调用 into() 方法绑定显 ...

  8. Glide图片加载框架的使用

    1. 介绍 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动.Glide提供了易用的API,高性能.可扩展的图片解码管道(decode pipeline),以及自动的资源池技术.G ...

  9. Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78357251 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

最新文章

  1. 一次关于DNS服务器的故障排错记录——RNDC故障
  2. python3 的encode 和 decode
  3. 项目微管理13 - 新人
  4. 【luogu 3811】【模板】乘法逆元
  5. Centos7安装netstat及简单使用
  6. BAT大佬给的Python神器,内附资源
  7. Codeforces 85D Sum of Medians
  8. ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await
  9. php mysql 随机字符串_MySQL_Mysql 自定义随机字符串的实现方法,前几天在开发一个系统,需要 - phpStudy...
  10. 【Github】开源项目xterm.js
  11. 以LeNet-5为例理解CNN
  12. BUAA-OO-2019 第三单元总结
  13. python脚本简化jar操作命令
  14. 外星人电脑为什么那么贵_为什么百丽的鞋那么贵
  15. Linux下Tomcat性能优化--文件句柄数增大
  16. 小波变换与傅里叶变换的区别
  17. 微信实时定位html5,微信公众号使用H5获取地理位置信息并定位
  18. html页面js跨域获取json数据,JS跨域获得Json的应用
  19. 梯度提升决策树GBDT
  20. [转载]WiFi有死角? 巧用旧无线路由器扩展覆盖

热门文章

  1. 宝塔内置phpmyadmin报502错误
  2. java如果是晴天如果是男人_java学习——第十一章(反射)
  3. 又是一年金九银十!java实战第二版pdf下载
  4. PMP 考点 第九章 项目资源管理
  5. 【Effection C++】读书笔记 条款27:尽量少做转型动作
  6. STM32.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.的问题。
  7. 应力波扩频通信系统实现(一)——控制器设计
  8. 小勇rust_基于领域和贝叶斯网络的P2P电子商务细粒度信任模型
  9. APISpace中秋API推荐
  10. 特斯拉:为什么我这么牛逼?