目录
一、src设置图片资源
二、scaleType设置图片缩放类型
三、scaleType具体表现
matrix:
fitXY:
fitStart:
fitCenter:
fitEnd:
Center:
centerCrop:
centerInside:
控制ImageView和图片的大小保持一致
maxHeight最大高度
maxWidth最大宽度
adjustViewBounds调整View的界限
四、自定义imageview
一、src设置图片资源
在drawable文件夹中导入图片资源
二、scaleType设置图片缩放类型
通过上面的图片可以看到,我导入的图片并没有占满整个ImageView控件,上下都有空白。这时可以通过scaleType来控制图片的缩放。
查看scaleType的源码,可以看到scaleType有很多值。
<attr name="scaleType"><!-- matrix:不改变原图大小,将图片放在ImageView的左上角 --><enum name="matrix" value="0" /><!-- fitXY 不按比例缩放图片,使得图片填充整个 ImageView,可能会导致图片拉伸变形 --><enum name="fitXY" value="1" /><!-- fitStart:保持图片的宽高比不变,直到较长的边与ImageView控件的边长相等,缩放完成后将图片放置于ImageView的左上角--><enum name="fitStart" value="2" /><!-- fitCenter:按比例缩放图片,使得图片完全显示在 ImageView 中,且居中显示,可能会留有空白 --><enum name="fitCenter" value="3" /><!-- fitEnd:按比例缩放图片,使得图片完全显示在 ImageView 中,且靠右下角显示,可能会留有空白 --><enum name="fitEnd" value="4" /><!-- center:将图片居中显示,不进行缩放。不改变原图大小。如果原图小于ImageView的大小,则保持原图大小,显示在ImageView的中心,当原图大于ImageView的大小时,只保留原图片中间的部分,其他部分裁剪掉 --><enum name="center" value="5" /><!--centerCrop:保持图片宽高比不变,缩放图片,直到完全覆盖ImageView,图片要在ImageView中居中。可能会出现图片显示不完整 --><enum name="centerCrop" value="6" /><!-- centerInside:按比例缩放图片,使得整个图片完全显示在 ImageView 中,可能会留有空白 --><enum name="centerInside" value="7" />
</attr>
三、scaleType具体表现
现在准备两张图片,RC.jpg(图片比ImageView大很多),RC2.jpg(图片比ImageView小)
matrix:
fitXY:
fitXY会改变原图片的宽高比,然后通过缩放使整个图片都显示在ImageView中
fitStart:
fitCenter:
fitEnd:
Center:
当我使用RC.jpg图片时,由于该图片很大,所以ImageView只会显示原图片中间大小为200dp*200dp(也就是ImageView的大小)的范围,也就是图中红色框的部分,其余部分全部裁剪掉。
最终显示的效果如下图:
但是如果我们使用RC2.jpg图片,由于该图片比ImageView小,所以会把RC2.jpg整个图片放在中间的位置,如下图
Center的特点:不改变图片的大小,按照原图片的大小显示在ImageView中间,但会将超出的部分裁剪
centerCrop:
通俗的讲就是以ImageView的宽高比为依据,在图片中间部分按照该比例取最大限度的范围,然后缩放显示在ImageView中。
比如我ImageView的大小设置的是200dp*200dp,也就是1:1大小,那么就在原图片中间部分1:1比例取一个最大的范围,然后缩小(因为我RC.jpg图片很大所以就是缩小,如果使用RC2.jpg那就是放大)显示在ImageView中
centerInside:
如果图片比ImageView大,那就缩小到把整个图片都放到ImageView中,此时类似于fitCenter
如果图片比ImageView小,那就直接将图片原大小放置在ImageView中间,此时类似于Center
控制ImageView和图片的大小保持一致
maxHeight最大高度
maxWidth最大宽度
adjustViewBounds调整View的界限
通过使用maxWidth和maxHeight来控制图片的最大宽度和最大高度,其中adjustViewBounds的值要设置为true才会生效。
当图片大于设置的maxWidth,maxHeight时,根据小的值(maxWidth为200dp,maxHeight为300dp,maxWidth小,所以以宽200dp为依据保持原图比例不变)来等比例缩小。
当图片的大小小于设置的maxWidth,maxHeight时,ImageView的大小就是原图片的大小。
四、自定义imageview
需求:把图片按照宽高、比例扩大,直到铺满手机屏幕宽度,高度按照原图片之前的比例扩大显示,如果刚刚好,不用做任何处理。
<com.widget.CustomFullImageViewandroid:id="@+id/iv_desc_icon"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="10dp"android:src="@drawable/test_icon" />
public class CustomFullImageView extends androidx.appcompat.widget.AppCompatImageView {public CustomFullImageView(Context context) {super(context);}public CustomFullImageView(Context context, AttributeSet attrs) {super(context, attrs);}public CustomFullImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {Drawable drawable = getDrawable();if (drawable != null) {int width = MeasureSpec.getSize(widthMeasureSpec);int imageWidth = drawable.getIntrinsicWidth();int imageHeight = drawable.getIntrinsicHeight();if (imageWidth > 0 && imageHeight > 0) {float scale = (float) width / imageWidth;// 计算按比例扩大后的高度int newHeight = (int) (imageHeight * scale);// 设置测量后的宽高setMeasuredDimension(width, newHeight);} else {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}} else {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}}
}