在項目中可能有這樣一個需求,需要加載巨大的圖片 并且還不允許壓縮。比如顯示:世界地圖、清明上河圖、微博長圖等。
那么對于這種需求,該如何做呢?
首先不壓縮,按照原圖尺寸加載,那么屏幕肯定是不夠大的,并且考慮到內(nèi)存的情況,不可能一次性整圖加載到內(nèi)存中,所以肯定是局部加載,那么就需要用到一個類:
BitmapRegionDecoder
其次,既然屏幕顯示不完,那么最起碼要添加一個上下左右拖動的手勢,讓用戶可以拖動查看。OK 下面講一下基本的知識點。
BitmapRegionDecoder的基本用法
? ? ? ? BitmapRegionDecoder能用來解碼一張圖片的某個矩形區(qū)域,這個類一般用在圖片過大而你又只需要該圖片的一部分的時候。為了生成BitmapRegionDecoder對象,可以調(diào)用newInstance(...),得到BitmapRegionDecoder后,使用者可以反復(fù)調(diào)用decodeRegion來獲得該圖片的不同區(qū)域的解碼得到的bitmap.
public Bitmap decodeRegion (Rect rect, BitmapFactory.Options options)
解碼該圖片的一個矩形區(qū)域,該區(qū)域由rect決定,返回值為顯示圖像為該區(qū)域的bitmap,注意options中不能使用inPurgeable這個參數(shù)。
inPremultiplied參數(shù)
如果設(shè)置了true(默認(rèn)是true),那么返回的圖片RGB都會預(yù)乘透明通道A后的顏色系統(tǒng)View或者Canvas繪制圖片,不建議設(shè)置為fase,否則會拋出異常,這是因為系統(tǒng)會假定所有圖像都預(yù)乘A通道的已簡化繪制時間.設(shè)置inPremultiplied的同時,設(shè)置inScale會導(dǎo)致繪制的顏色不正確.
public int getHeight (),public int getWidth ()? ? 獲取原圖片的寬和高。下面通過一個例子進行深入的講解
1、生成Bitmap對象

2、獲得圖片的寬高(一會邊界檢查會用到)

3、創(chuàng)建一個Rect (Rect類主要用于表示坐標(biāo)系中的一塊矩形區(qū)域,并可以對其做一些簡單操作)

4、繪制

通過我們上面得到的BitmapRegionDecoder 對象 得到 bitmap 然后通過canvas畫出來
5、觸摸反饋(畢竟把一張大圖只顯示其中的一個區(qū)域然后它還不動 用戶會罵娘)
這里我用了最簡單的方法 重寫了onTouchEvent方法

下面是整個自定義View的完整代碼
