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