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

时间:2024-08-26 06:34:24编辑:coo君

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

在使用 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 之上。

ImageView中的ScaleType详解

下面举个例子对以上几点属性逐条说明 准备一张400x300的图片,命名为:test_400x300,写一个简单的布局,观察右边preview预览图的变化。 fitCenter是ImageView控件的 默认ScaleType 。 它表示把一个图片缩放到当前View大小,小于的图片会放大,大图会缩小。事例图片见上文”准备“中的图。 把图片缩小到ImageView区域中,并居中显示。它与FIT_CENTER的区别在于,如果是小于该控件的图,则不会放大,而是维持图的大小直接居中显示。 android:scaleType="centerInside" test_400x300.png在drawable-hdpi中 直接把图片居中显示,不进行任何缩放动作,在控件区域内的则显示,不在就不显示。当图片小于控件时,与CENTER_INSIDE作用一样。 放大或缩小图片直到图片的中间区域恰好可以把控件区域填满。 android:scaleType="centerCrop" test_400x300.png在drawable-mdpi或drawable-hdpi中 放大或缩小图片到正好可以放入到空间中的大小,与 FIT_CENTER 的不同点在于,把图片居下(长大于宽是)或居右(框大于长时)显示。 与 FIT_END 基本相同,只是图片会居左或上显示。 不固定长宽比例 的缩小或放大图片,直到用图片把控件区域全部填满。 用矩阵的方式绘制,从控件的左上角开始,不缩放图片,与 CENTER 相似,不同点在于把图片的左上角对上控件的左上角显示,超出控件的部分不显示。 android:scaleType="matrix" test_400x300.png在drawable-hdpi中 以上,除 fitXY 长宽比例不固定外,其他5中scale方法长宽比例都固定。

如何通过代码设置TextView的Margin参数?

首先定义个LayoutParams,然后在设置margin,在把这个LayoutParams设置给控件,如下:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(10,10,10,10);//4个参数按顺序分别是左上右下

mView.setLayoutParams(layoutParams);


如何用代码创建ImageView ,并设置图片

//定义ImageView(两种方式)ImageView imageView = new ImageView(this); //orImageView imageView = (ImageView)this.findViewById(R.id.xxxx); //or//通过ImageView控件显示图片(三种方式)imageView.setImageBitmap(Bitmap bm); // orimageView.setImageDrawable(Drawable drawable); //orimageView.setImageResource(int resId); //or


上一篇:微型车比较,微型电动小汽车哪个品牌口碑好?

下一篇:物价平减指数,价格总指数怎么计算?