Glide-图片的剪裁(ScaleType)
前言:
这一节里面我们将讲到关于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)相关推荐
- Android Glide图片加载框架(二)源码解析之into()
文章目录 一.前言 二.源码解析 1.into(ImageView) 2.GlideContext.buildImageViewTarget() 3.RequestBuilder.into(Targe ...
- Glide图片框架使用详细介绍(一)
一.背景介绍 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开源项目中,包括2014年google I/O ...
- Android Glide图片加载框架(四)回调与监听
文章目录 Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源码解析之with() Android Gl ...
- Android Glide图片加载框架(三)缓存机制
文章目录 一.缓存简介 二.缓存用法 内存缓存方式 磁盘缓存方式 三.缓存KEY 四.内存缓存 内存缓存流程 五.磁盘缓存 磁盘缓存流程 Android Glide图片加载框架系列文章 Android ...
- Android Glide图片加载框架(二)源码解析之load()
文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...
- Android Glide图片加载框架(二)源码解析之with()
文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...
- Android Glide图片加载框架(一)基本用法
文章目录 一.前言 二.简介 三.基本用法 第一步:调用 Glide.with() 方法创建加载图片的实例 第二步:调用 load() 方法指定待加载的图片资源 第三步:调用 into() 方法绑定显 ...
- Glide图片加载框架的使用
1. 介绍 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动.Glide提供了易用的API,高性能.可扩展的图片解码管道(decode pipeline),以及自动的资源池技术.G ...
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78357251 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...
最新文章
- 一次关于DNS服务器的故障排错记录——RNDC故障
- python3 的encode 和 decode
- 项目微管理13 - 新人
- 【luogu 3811】【模板】乘法逆元
- Centos7安装netstat及简单使用
- BAT大佬给的Python神器,内附资源
- Codeforces 85D Sum of Medians
- ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await
- php mysql 随机字符串_MySQL_Mysql 自定义随机字符串的实现方法,前几天在开发一个系统,需要 - phpStudy...
- 【Github】开源项目xterm.js
- 以LeNet-5为例理解CNN
- BUAA-OO-2019 第三单元总结
- python脚本简化jar操作命令
- 外星人电脑为什么那么贵_为什么百丽的鞋那么贵
- Linux下Tomcat性能优化--文件句柄数增大
- 小波变换与傅里叶变换的区别
- 微信实时定位html5,微信公众号使用H5获取地理位置信息并定位
- html页面js跨域获取json数据,JS跨域获得Json的应用
- 梯度提升决策树GBDT
- [转载]WiFi有死角? 巧用旧无线路由器扩展覆盖
热门文章
- 宝塔内置phpmyadmin报502错误
- java如果是晴天如果是男人_java学习——第十一章(反射)
- 又是一年金九银十!java实战第二版pdf下载
- PMP 考点 第九章 项目资源管理
- 【Effection C++】读书笔记 条款27:尽量少做转型动作
- STM32.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.的问题。
- 应力波扩频通信系统实现(一)——控制器设计
- 小勇rust_基于领域和贝叶斯网络的P2P电子商务细粒度信任模型
- APISpace中秋API推荐
- 特斯拉:为什么我这么牛逼?