显示长图失败
我们知道,ImageView经常用来显示一些位图,但是不是所有的图片都能够正常显示的,很明显不是的,当图片超过了一定的大小之后,你会发现,调用setImageBitmap(Bitmap bitmap)方法之后,图片没有正常显示出来,并且可显示的区域也没有显示对应的图片,这是为什么呢?
测试
做了一个实验,将一个如图大小的Bitmap设置给ImageView,图片没有显示出来,并且出现了如下异常,
Bitmap too large to be uploaded into a texture , 原来在硬件加速的时候,对图片的大小是有限制,不同设备的最大值不同。但是,在程序中并没有捕获到这个exception, 结果就是是程序也不奔溃,图片也显示不出来。只有看log才能发现这个异常信息。具体在stackoverflow 上面也有相关描述:https://stackoverflow.com/questions/7428996/hw-accelerated-activity-how-to-get-opengl-texture-size-limit
一般我们可以通过如下方法获取得到你的设备能够支持的最大图片宽高。
/**
* Returns the maximum allowed height for bitmaps drawn with this canvas.
* Attempting to draw with a bitmap taller than this value will result
* in an error.
*
* @see #getMaximumBitmapWidth()
*/
public int getMaximumBitmapHeight() {
return MAXMIMUM_BITMAP_SIZE;
}
/**
* Returns the maximum allowed height for bitmaps drawn with this canvas.
* Attempting to draw with a bitmap taller than this value will result
* in an error.
*
* @see #getMaximumBitmapWidth()
*/
public int getMaximumBitmapHeight() {
return MAXMIMUM_BITMAP_SIZE;
}
如何显示长图
如上,我们知道大小的显示是因为硬件加速的影响,那么我们简单粗暴的方法就是调用方法setLayerType(View.LAYER_TYPE_SOFTWARE, null);设置为软件加速,但这样子会带来另外一个问题,图片显示异常,因为高度比较大,所以显示出来宽度就被压缩了。如果图片不能够放大缩小的话,根本就看不清图片。如果你的项目较容易引入开源框架的话,可以考虑使用开源框架PhotoView来显示,他里面就实现了手势放大缩小等操作。要不然也可以利用google提供的BitmapRegionDecoder类去扩展ImageView的相关功能来实现。在下面的相关资料有详细的介绍。