Android 大尺寸圖片加載

Android 中圖片的加載是個很頭疼的問題懈玻,不過還好我們有Glide(逃跑臉..)
不過當(dāng)你有要顯示一張遠超手機尺寸的超大圖片的需求時蛤吓,Glide也幫不了你闲昭,我現(xiàn)在慌得一B(躺草地)
為什么慌呢更耻,因為長這樣


全部加載

可以看到脱羡,首先顯示上有問題找都,其次整張圖片加載到了內(nèi)存中唇辨,我們用 Android Profiler 抓一下看看占了多少內(nèi)存


image.png

我滴乖乖,占了快 34M能耻,還好我手機分配給應(yīng)用的內(nèi)存夠大赏枚。那么要如何解決這兩個問題呢?且看分解:

一.圖片加載占用內(nèi)存的計算

影響圖片在內(nèi)存中大小的有三個元素:
1.圖片原始寬高
2.圖片的色彩空間
3.圖片的縮放比

(1)圖片原始寬高:它們的乘積代表圖片的總像素點數(shù)
(2)圖片的色彩空間:每個像素點的信息嚎京,占用多少字節(jié)嗡贺,比如 Bitmap.Config.ARGB8888 代表每個色彩通道占8bit位 總共就是 4個字節(jié),可以在 BitmapFactory.Options 的 inPreferredConfig 屬性進行調(diào)節(jié)鞍帝,常用的還有 Bitmap.Config.RGB565
(3)圖片的縮放比:對圖片原始寬高的縮放诫睬,影響是次方級的,因為分別作用在了寬和高上帕涌。
它對應(yīng)的設(shè)置在 BitmapFactory.Options 的 inSampleSize 屬性摄凡,代表采樣率,默認為1蚓曼,必須大于1且為2的倍數(shù)
比如設(shè)置為 4 亲澡,則圖片的寬高都將變?yōu)樵嫉?1/4 ,那么總像素點數(shù)就變?yōu)榱嗽嫉?1/16

綜上總結(jié)的計算公式為:

圖片占用內(nèi)存= (原始寬 * 縮放比) * (原始高 * 縮放比) * 色彩空間

我們算一下剛才的圖進行驗證一下纫版,妹子圖寬 690px 高12287px 直接展示時 縮放比 inSampleSize =1 色彩空間ARGB8888
所以 內(nèi)存= 690 * 1 * 12287 * 1 * 4 = 33912120 和我們圖中抓的基本一致

平時在使用Glide進行加載圖片時床绪,框架里幫我們處理了縮放,Glide默認會加載并緩存具體尺寸的圖片,同時3.x版本的Glide默認使用RGB565的顏色通道癞己,這些都會幫助我們節(jié)省內(nèi)存

二.圖片分區(qū)域加載

既然我們一個屏幕展示不下這張圖膀斋,那么我們就顯示一部分,Android 中已經(jīng)提供了 解碼圖片部分區(qū)域的類 BitmapRegionDecoder,使用起來也很簡單


BitmapRegionDecoder

它提供了一系列靜態(tài)方法構(gòu)造實例


image.png

拿到實例后 通過 #decodeRegion() 方法痹雅,傳入一個 Rect 和 一個BitmapFactory.Options 參數(shù) 即可解碼出一張我們要的圖片解碼區(qū)域就是我們 Rect 指定的范圍仰担,拿到 Bitmap 后當(dāng)然可以為所欲為了

三.手勢檢測

我們已經(jīng)能夠展示大圖的部分區(qū)域了,那么勢必需要提供手勢操作讓用戶滑動或點擊來對圖片加載的區(qū)域或大小進行更新也就是需要自定義控件重寫 onTouchEvent方法進行處理

這里可以參考洋神的做法:https://blog.csdn.net/lmj623565791/article/details/49300989/

將手勢的處理交給 MoveGestureDetector 然后每次滑動完在 onDraw 里更新 解碼的區(qū)域 Rect

但是有兩個問題绩社,當(dāng)你將洋神的代碼跑起來后摔蓝,在 7.0 以上的手機上會發(fā)現(xiàn)圖劃不動,并且得到一個日志:

D/skia: --- SkAndroidCodec::NewFromStream returned null

經(jīng)Google 解決了問題:https://stackoverflow.com/questions/39316069/bitmapfactory-decodestream-from-assets-returns-null-on-android-7

大致就是 Google改了 BitmapFactory.cpp的代碼愉耙,我們需要在兩次decode 之間將 流重置一下 如下:洋神的 LargeImageView.java


LargeImageView.java

第二個問題就是跑起來你會發(fā)現(xiàn)滑動起來很卡贮尉,體驗很差,因為動一動就一直在重繪劲阎。

解決方法就是不要繼承View 绘盟,我看世界地圖那個項目是繼承自 SurfaceView的鸠真,將繪制放到單獨的線程

https://github.com/johnnylambada/WorldMap/blob/master/library/src/com/sigseg/android/map/ImageSurfaceView.java

四.開源項目解決方案

1.這個作者加了手勢縮放悯仙,雙擊等的處理,同時對顯示區(qū)域進行了緩存吠卷,實測很棒

https://github.com/kareluo/IntensifyImageView

2.一個N年前star的庫锡垄,但一直還沒用過

https://github.com/davemorrissey/subsampling-scale-image-view

五.另辟蹊徑的方式

使用WebView 進行展示,思路來自N年前聽說有個開源第三方微博客戶端是這么搞的

具體參考:https://blog.csdn.net/android_zhengyongbo/article/details/70225377

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祭隔,一起剝皮案震驚了整個濱河市货岭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疾渴,老刑警劉巖千贯,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搞坝,居然都是意外死亡搔谴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門桩撮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敦第,“玉大人,你說我怎么就攤上這事店量∥吖” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵融师,是天一觀的道長右钾。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么舀射? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任灭将,我火速辦了婚禮,結(jié)果婚禮上后控,老公的妹妹穿的比我還像新娘庙曙。我一直安慰自己,他們只是感情好浩淘,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布捌朴。 她就那樣靜靜地躺著,像睡著了一般张抄。 火紅的嫁衣襯著肌膚如雪砂蔽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天署惯,我揣著相機與錄音左驾,去河邊找鬼。 笑死极谊,一個胖子當(dāng)著我的面吹牛诡右,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轻猖,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼帆吻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咙边?” 一聲冷哼從身側(cè)響起猜煮,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎败许,沒想到半個月后王带,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡市殷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年愕撰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被丧。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡盟戏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甥桂,到底是詐尸還是另有隱情柿究,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布黄选,位于F島的核電站蝇摸,受9級特大地震影響婶肩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜貌夕,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一律歼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啡专,春花似錦险毁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慧库,卻和暖如春跷跪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背齐板。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工吵瞻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甘磨。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓橡羞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宽档。 傳聞我的和親對象是個殘疾皇子尉姨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,305評論 25 707
  • 7.1 壓縮圖片 一庵朝、基礎(chǔ)知識 1吗冤、圖片的格式 jpg:最常見的圖片格式。色彩還原度比較好九府,可以支持適當(dāng)壓縮后保持...
    AndroidMaster閱讀 2,523評論 0 13
  • 一椎瘟、簡介 在泰國舉行的谷歌開發(fā)者論壇上,谷歌為我們介紹了一個名叫Glide的圖片加載庫侄旬,作者是bumptech肺蔚。這...
    天天大保建閱讀 7,491評論 2 28
  • 羅煉閱讀 88評論 0 0
  • 我出生在南方的一個小城市儡羔,小時候宣羊,我以為我家很窮,因為我爺爺?shù)穆殬I(yè)是養(yǎng)牛賣牛奶汰蜘,我的爸爸子承父業(yè)仇冯,也是以賣牛...
    玄月如弓閱讀 485評論 0 0