? ? ?app項(xiàng)目開發(fā)過程中澜掩,大都有查看圖片詳情的功能模塊前硫。實(shí)現(xiàn)的方式一般都是通過viewpager+photoView+Glide的方式淮野。這種方式下宇挫,如果碰到加載超長圖苛吱,比如說高清版的清明上河圖/世界地圖,肯定就加載不出來了器瘪。
? ? ? 系統(tǒng)會提示如下異常:
log的意思就是圖片太大了翠储。這個時候BitmapRegionDecoder就派上了用場了。
? ? ?android開發(fā)文檔的解釋是BitmapRegionDecoder允許從圖片扣取一個圖塊加載橡疼,這就能很好的加載高清長圖也能有效的防止內(nèi)存溢出了援所。
? ? ?SubsamplingScaleImageView就是基于BitmapRegionDecoder封裝的開源框架。
? ? ?GitHub地址:https://github.com/davemorrissey/subsampling-scale-image-view.git??
? ? ?現(xiàn)在問題來了衰齐,我們要在原有viewpager+photoView+Glide的基礎(chǔ)上加上SubsamplingScaleImageView任斋。photoView+Glide的方式能加載普通圖和GIF圖,SubsamplingScaleImageView是基于BitmapRegionDecoder,不能加載GIF圖废酷。(如果需要加載超大/幀數(shù)比較多的GIF瘟檩,需要另找算法處理)
? ? 關(guān)鍵代碼如下:
1.根據(jù)圖片url后綴判斷圖片是否GIF圖,如果是GIF圖澈蟆,執(zhí)行GIF圖的加載策略墨辛;
2.普通圖片先通過Glide加載得到Bitmap的寬/高,如果高度超過了定義的MaxSize或者寬高比超過了MaxScale趴俘,就認(rèn)為是超長圖睹簇,需要通過SubsamplingScaleImageView去顯示。為了使超長圖平鋪滿屏幕的寬度從(0,0)點(diǎn)開始顯示寥闪,我們需要計(jì)算zoom的scale的size太惠。
計(jì)算方式如下:
3.普通非超長圖 就簡單了直接通過photoView去顯示。
Demo GitHub地址:https://github.com/gongchaobin/GlideLargePicDemo.git