android中在ImageView中完美填充一张Bitmap图片

在Android中,使用ImageView填充大尺寸或小尺寸Bitmap时会遇到问题。大图可能导致黑屏,小图无法充分利用屏幕。通过手动调整Bitmap尺寸结合ScaleType=center可以解决这些问题。关键在于根据屏幕尺寸按比例缩放Bitmap,确保长宽至少一者等于ImageView的长宽,避免黑边。XML中ImageView的scaleType需设置为"center"。
部署运行你感兴趣的模型镜像

有人说我们用ImageView的scaleType就可以完美解决任何问题,但是实验过你就会发现,还是会有问题。

问题1:过大的Bitmap。当给ImageView填充一张(2000+)*(4000+)的千万级像素左右的图片时,ImageView不能显示,变成了黑屏。

问题2:过小的图片,为了能充分利用屏幕的空间,自然要把小的图片"尽可能"地放大。我们要做得,就是按比例缩放/扩大图片,使得长或者宽的其中一个小于等于ImageView的长或宽。

为了解决以上两个问题:

CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示

CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)

CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽

FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示

FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置

FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置

FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示

MATRIX / matrix 用矩阵来绘制

其中

center:和屏幕比例不符的图片会被截取,所以不行。

centerCrop:同上。

centerInside:不能将小图放大,而且笔者在用它放置和设备长宽比例一致的图片时,出现了黑边,从测试发现是Bitmap并没有覆盖全ImageView。

fitCenter:问题1虽然不能解决,但看样子是最接近我们要求效果的一个,但是同样的,测试时发现了黑边。

fitEnd/fitStart:这两个不居中的就不讨论了。

matrix:它不能满足我们按比例放大/缩小的要求。

因为黑边的关系, 我就不能完全信任ImageView的自动缩放功能了,最后笔者选择了手动调整Bitmap的尺寸+ScaleType=center (它不支持缩放,但我们已经自己手动缩放完毕了)解决了。

要点:

1.如果竖屏要展示横屏的图片,就要把它作缩放处理,同样地,对于过大的图片,我们都会要求把它缩小到长和宽都小于等于设备长宽为止。

2.反之,对于过小的图片,我们都会要求把它扩大到长或宽的一者等于设备长宽为止。

3.在XML中要定义ImageView的scaleType="center"

关键代码:

private void createScaledBitmap(){
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		int width = dm.widthPixels+1;
		int height = dm.heightPixels+1;
		int t_width;
		int t_height;
		if (bitmap.getWidth()>width || bitmap.getHeight()>height){
			t_width = width;
			t_height = bitmap.getHeight()*width/bitmap.getWidth();
			if (t_height>height){
				t_width = t_width*height/t_height;
				t_height = height;
			}
		} else
		if (bitmap.getWidth()<width && bitmap.getHeight()<height){
			t_width = width;
			t_height = bitmap.getHeight()*width/bitmap.getWidth();
			if (t_height>height){
				t_width = t_width*height/t_height;
				t_height = height;
			}
		} else {
			t_width = bitmap.getWidth();
			t_height = bitmap.getHeight();
		}
		bitmap = Bitmap.createScaledBitmap(bitmap, t_width, t_height, true);
	}



您可能感兴趣的与本文相关的镜像

AutoGPT

AutoGPT

AI应用

AutoGPT于2023年3月30日由游戏公司Significant Gravitas Ltd.的创始人Toran Bruce Richards发布,AutoGPT是一个AI agent(智能体),也是开源的应用程序,结合了GPT-4和GPT-3.5技术,给定自然语言的目标,它将尝试通过将其分解成子任务,并在自动循环中使用互联网和其他工具来实现这一目标

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值