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

有人说我们用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()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);
	}



你可能感兴趣的:(android开发,android,imageview,bitmap,全屏显示图片,缩放)