android加載大圖

在項目中可能有這樣一個需求,需要加載巨大的圖片 并且還不允許壓縮。比如顯示:世界地圖、清明上河圖、微博長圖等。

那么對于這種需求,該如何做呢?

首先不壓縮,按照原圖尺寸加載,那么屏幕肯定是不夠大的,并且考慮到內(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對象

0.png

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

1.png

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

2.png

4、繪制

3.png

通過我們上面得到的BitmapRegionDecoder 對象 得到 bitmap 然后通過canvas畫出來

5、觸摸反饋(畢竟把一張大圖只顯示其中的一個區(qū)域然后它還不動 用戶會罵娘)

這里我用了最簡單的方法 重寫了onTouchEvent方法

4.png

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

5.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容