有人说我们用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);
}
在Android中,使用ImageView填充大尺寸或小尺寸Bitmap时会遇到问题。大图可能导致黑屏,小图无法充分利用屏幕。通过手动调整Bitmap尺寸结合ScaleType=center可以解决这些问题。关键在于根据屏幕尺寸按比例缩放Bitmap,确保长宽至少一者等于ImageView的长宽,避免黑边。XML中ImageView的scaleType需设置为"center"。
2003

被折叠的 条评论
为什么被折叠?



