在項(xiàng)目中可能有這樣一個(gè)需求诗充,需要加載巨大的圖片 并且還不允許壓縮惶傻。比如顯示:世界地圖、清明上河圖其障、微博長(zhǎng)圖等银室。
那么對(duì)于這種需求,該如何做呢?
首先不壓縮蜈敢,按照原圖尺寸加載辜荠,那么屏幕肯定是不夠大的,并且考慮到內(nèi)存的情況抓狭,不可能一次性整圖加載到內(nèi)存中伯病,所以肯定是局部加載,那么就需要用到一個(gè)類:
BitmapRegionDecoder
其次否过,既然屏幕顯示不完午笛,那么最起碼要添加一個(gè)上下左右拖動(dòng)的手勢(shì),讓用戶可以拖動(dòng)查看苗桂。OK 下面講一下基本的知識(shí)點(diǎn)药磺。
BitmapRegionDecoder的基本用法
? ? ? ? BitmapRegionDecoder能用來(lái)解碼一張圖片的某個(gè)矩形區(qū)域,這個(gè)類一般用在圖片過(guò)大而你又只需要該圖片的一部分的時(shí)候煤伟。為了生成BitmapRegionDecoder對(duì)象癌佩,可以調(diào)用newInstance(...),得到BitmapRegionDecoder后便锨,使用者可以反復(fù)調(diào)用decodeRegion來(lái)獲得該圖片的不同區(qū)域的解碼得到的bitmap.
public Bitmap decodeRegion (Rect rect, BitmapFactory.Options options)
解碼該圖片的一個(gè)矩形區(qū)域围辙,該區(qū)域由rect決定,返回值為顯示圖像為該區(qū)域的bitmap,注意options中不能使用inPurgeable這個(gè)參數(shù)放案。
inPremultiplied參數(shù)
如果設(shè)置了true(默認(rèn)是true)姚建,那么返回的圖片RGB都會(huì)預(yù)乘透明通道A后的顏色系統(tǒng)View或者Canvas繪制圖片,不建議設(shè)置為fase,否則會(huì)拋出異常,這是因?yàn)橄到y(tǒng)會(huì)假定所有圖像都預(yù)乘A通道的已簡(jiǎn)化繪制時(shí)間.設(shè)置inPremultiplied的同時(shí),設(shè)置inScale會(huì)導(dǎo)致繪制的顏色不正確.
public int getHeight (),public int getWidth ()? ? 獲取原圖片的寬和高吱殉。下面通過(guò)一個(gè)例子進(jìn)行深入的講解
1桥胞、生成Bitmap對(duì)象
2、獲得圖片的寬高(一會(huì)邊界檢查會(huì)用到)
3考婴、創(chuàng)建一個(gè)Rect (Rect類主要用于表示坐標(biāo)系中的一塊矩形區(qū)域贩虾,并可以對(duì)其做一些簡(jiǎn)單操作)
4、繪制
通過(guò)我們上面得到的BitmapRegionDecoder 對(duì)象 得到 bitmap 然后通過(guò)canvas畫出來(lái)
5沥阱、觸摸反饋(畢竟把一張大圖只顯示其中的一個(gè)區(qū)域然后它還不動(dòng) 用戶會(huì)罵娘)
這里我用了最簡(jiǎn)單的方法 重寫了onTouchEvent方法
下面是整個(gè)自定義View的完整代碼