提高班1:ImageView中ScaleType属性详解,配图详解

前言:
复制代码

    为什么我的第一期提高班准备做这个专题呢?针对初学者哈,相信很多初学的兄弟对这个属性的熟悉度是暂时及格的状态,现在的网络框架,像Glide,Picasso,这些框架中都是封装好了对图片的加载,而且现在网上还有很多对Glide,Picasso这些框架的封装好的工具类,也就是说,我们在代码中给ImageView加载图片时,直接一行代码搞定,比如:GlideUtils.loadPic(参数1,参数2,参数......),这确实方便好多,反正图片加载出来了啊,还加载的挺完美,快看,还没有白边哎......但是其中对ImageView属性的设定,无情的隐藏了,比如ScaleType。

    这个ScaleType到底有什么用呢?兄弟们有没有发现,在加载图片的时候,有些图片显示会留“上下白边”或者“左右白边”,有些图片显示会变形,还有些图片显示会被截取,就像你自己的全身照,在手机上显示的时候,发现头没啦,示例如下,请看那位“呆萌的猕猴桃”同学:

正文部分:
复制代码

一、ScaleType的设置的值产生的变换结果,和哪些因素有关?

ScaleType的设置值和ImageView搭配起来产生的化学反应为什么让照片中的头没了呢?即ScaleType的设置的值产生的变换结果,和哪些因素有关?

因素只有两个:
1.ImageView的宽高。
2.图片的宽高----这也可以叫图片的分辨率,宽*高=图片分辨率。

与以上两个因素相对情况有以下3种:
(以下示例的ImageView宽高为100dp*100dp,手机为1280 * 720,所以换算后,1dp=2px,所以下述示例的图片的宽高也可以看做为----这块不懂得,请转向我的:提高班2:屏幕适配详解)
第一种:ImageView的宽高>=图片宽高:

上图宽高为72px*32px

第二种:ImageView的宽高<图片宽高:

上图宽高:480px*800px
第三种:ImageView的宽>图片的宽,ImageView的高 < 图片的高
或者ImageView的宽<图片的宽,ImageView的高 > 图片的高
即图片的1条 > ImageView,另一条边 < ImageView。


上图宽高:100px*500px

好了,情况,就是这么个情况,而ScaleType的属性各个值就是对上述的三种可能出现的情况分别做处理。

二、ScaleType属性值详解
1.android:scaleType="matrix"
matrix表示原图从ImageView的左上角开始绘制,如果原图大于ImageView,那么多余的部分则剪裁掉,如果原图小于ImageView,那么对原图不做任何处理,直接全部展示。
示例:(这里说明一下,为了好区分和展示效果,下面的示例图,包括scaleType其他值的示例图,红色是ImageView的背景色,蓝色Activity的背景色)

2.android:scaleType="fitXY",图片可能变形,必须完全填充控件。
fitXY的目标是填充整个ImageView,,它需要对图片进行一些缩放操作,如果图片的宽 > ImageView的宽,则图片在宽方向上需要缩放到ImageView的宽度;如果图片的宽 < ImageView的宽,则图片在宽方向上需要扩张到ImageView的宽度;这个规则同理与高方向。----最终造成的结果:图片变形,并且填充ImageView
示例:

3.android:scaleType="center"
以原图的几何中心点和ImagView的几何中心点为基准,按图片的原来size居中显示,不缩放,当图片长/宽超过View的长/宽,则截取图片的居中部分显示ImageView的size.当图片小于View 的长宽时,只显示图片的size,不放大。关键字:不缩放,截图


4.android:scaleType="centerInside"
全部显示图片。 以原图的几何中心点和ImagView的几何中心点为基准,将图片的内容完整居中显示,不放大,只缩小。当原图>imageView时,缩小原图,使其小于等于ImageView,显示全图(类似fitCenter);当原图 < imageView时,不放大,居中显示原图。

示例图:

5.android:scaleType="centerCrop" 按照下述规则完全填充控件,超出部分会被裁剪。
(1)当图片大于ImageView的宽高:以图片的中心点和ImageView的中心点为基准,按比例缩小图片,直到图片的宽高有一边等于ImageView的宽高,则对于另一边,图片的长度大于或等于ImageView的长度,最后用ImageView的大小居中截取该图片。 (2)当图片小于ImageView的宽高:以图片的中心店和ImageView的中心点为基准,按比例扩大图片,直到图片的宽高大于或等于ImageView的宽高,并按ImageView的大小居中截取该图片。 最终结论: 1.图片的大小肯定是>=ImageView的大小; 2.在放大或者缩小的最终节点为:图片的宽和高比ImageView的宽和高都要大的时候,比如一张图片宽>高,ImageView的宽高都是100dp,在图片扩大或者缩小的过程中,肯定是图片宽的扩大或者缩小的程度先>=ImageView,但是这个时候,高扩大或者缩小的程度肯定是<=ImageView的,那么这个时候,图片的扩大和缩小不会停止,直到图片的高>=ImageView的时候,才会停止扩大或者缩小。 3.图片会填满整个控件,图片可能会被裁剪。
示例图:

6.fitXXX系列
android:scaleType="fitCenter"
android:scaleType="fitStart"
android:scaleType="fitEnd"
完全显示图片,图片不会被裁剪
(1).fitCenter:
把图片按比例扩大(缩小)到View的宽度(短的边),居中显示。显示全部图片,通过按比例缩小(扩大)原来的size使得图片长(宽)等于或小于ImageView的长(宽)。关键字:按比例缩放,居中显示全图,不裁剪。----图片肯定会全部显示。

(2).fitStart:
把图片按比例扩大(缩小)到View的宽度,显示在View的上部分位置。关键字:按比例缩放,靠左显示全图,不裁剪----以左上角为基准点。

(3).fitEnd:
把图片按比例扩大(缩小)到View的宽度,显示在View的下部分位置。关键字:按比例缩放,靠右显示全图,不裁剪----以右下角为基准点。

转载于:https://juejin.im/post/5c9c7f306fb9a070ee429f8f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值