目录
一、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.CustomFullImageView
android: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);
}
@Override
protected 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);
}
}
}