图片基础知识梳理(1) - ImageView 的 ScaleType 属性解析

 我来答
科创17
2022-06-03 · TA获得超过5929个赞
知道小有建树答主
回答量:2846
采纳率:100%
帮助的人:178万
展开全部

在使用 ImageView 的过程当中,经常需要通过 scaleType 来对原始的图像进行处理,使得它能在空间中合理地展示。

首先,我们简单介绍一下 scaleType 的分类:

这种情况下,对应的模式只有一种:

最终,在这种情况下,我们可以同 setImageMatrix(Matrix matrix) 来改变。

这一类属性的特点就是 通过拉伸或者压缩图片,使得原图片中所有元素都能够展现,并且至少填满控件 x,y 轴的其中一个
一共有四类:

下面三种都会 维持原图的比例 ,使得它们的 x,y 都小于等于控件的宽高,只是最终的图形放的位置不同。

下面的三种类型都会使得控件的中心和图片中心重合:

它不要求原始图片填满 x,y 轴的任意一个,因此, 如果原图的长宽都小于等于控件的长宽,不会进行放大操作,这也是它和 ScaleType.FIT_CENTER 的区别

下面,我们通过一个简单的 Demo 来展示一下各种类型的具体表现,我们有两个大小一样的 ImageView 和两个大小不同的原图,其中左边的 ImageView 要比原图小,右边的 ImageView 要比原图大。

在 ImageView 当中,设置图片的接口主要有下面几个函数:

我们就以平时常用的 setImageBitmap 为例,分析一下它整个的流程:

上面的关键方法在 updateDrawable 当中:

在 configureBounds 里就会根据我们所配置的 scaleType 来决定 mDrawable 如何显示,在这里面有一个重要的变量 mDrawMatrix ,我们前面说到的所有变换都是通过它来实现的,当然,我们除了可以让系统自己根据 scaleType 来生成 matrix ,也可以通过 setImageMatrix 手动的指定自己的变换:

那么这个 mDrawMatrix 是在什么时候使用的呢,我们看一下 onDraw 方法:

我们总结一下,整个 scaleType 的原理就是在 configureBounds 中配置了 mDrawMatrix ,而在 onDraw 当中会根据 mDrawMatrix 来对图层进行变换,在这个变换之后的图层上进行绘制 mDrawable ,之后再恢复图层。

上面,我们看到的都是 src 设置的效果,我们回忆一下,通过设置 android:background 也可以设置一个图片给它,其实 background 是 View 的属性,在我们之前分析 View 的绘制流程的时候, draw(canvas) 中有一步就是绘制背景:

我们来看一下设置背景的边界的函数,可以看到,这里没有考虑 padding 值,也就是说我们通过 background 设置的图片是填满整个控件,并且不考虑 padding 的:

最后再结合一下第四节的知识,我们是先绘制背景,然后才在 ImageView 的 onDraw 函数当中在 canvas 上绘制的,因此, src 的图片一定会绘制在 backgroud 之上。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式