顯示長圖失敗
我們知道袖扛,ImageView經(jīng)常用來顯示一些位圖豆茫,但是不是所有的圖片都能夠正常顯示的迅箩,很明顯不是的溉愁,當圖片超過了一定的大小之后,你會發(fā)現(xiàn)饲趋,調(diào)用setImageBitmap(Bitmap bitmap)方法之后,圖片沒有正常顯示出來撤蟆,并且可顯示的區(qū)域也沒有顯示對應(yīng)的圖片奕塑,這是為什么呢?
測試
做了一個實驗家肯,將一個如圖大小的Bitmap設(shè)置給ImageView龄砰,圖片沒有顯示出來,并且出現(xiàn)了如下異常讨衣,
Bitmap too large to be uploaded into a texture , 原來在硬件加速的時候换棚,對圖片的大小是有限制,不同設(shè)備的最大值不同反镇。但是固蚤,在程序中并沒有捕獲到這個exception, 結(jié)果就是是程序也不奔潰,圖片也顯示不出來歹茶。只有看log才能發(fā)現(xiàn)這個異常信息夕玩。具體在stackoverflow 上面也有相關(guān)描述:https://stackoverflow.com/questions/7428996/hw-accelerated-activity-how-to-get-opengl-texture-size-limit
一般我們可以通過如下方法獲取得到你的設(shè)備能夠支持的最大圖片寬高。
/**
* 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;
}
如何顯示長圖
如上惊豺,我們知道大小的顯示是因為硬件加速的影響燎孟,那么我們簡單粗暴的方法就是調(diào)用方法setLayerType(View.LAYER_TYPE_SOFTWARE, null);設(shè)置為軟件加速,但這樣子會帶來另外一個問題尸昧,圖片顯示異常揩页,因為高度比較大,所以顯示出來寬度就被壓縮了烹俗。如果圖片不能夠放大縮小的話爆侣,根本就看不清圖片。如果你的項目較容易引入開源框架的話衷蜓,可以考慮使用開源框架PhotoView來顯示累提,他里面就實現(xiàn)了手勢放大縮小等操作。要不然也可以利用google提供的BitmapRegionDecoder類去擴展ImageView的相關(guān)功能來實現(xiàn)磁浇。在下面的相關(guān)資料有詳細的介紹斋陪。