亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android加載長圖的多種方案分享

 更新時間:2021年04月27日 11:45:41   作者:rivenlee  
這篇文章主要介紹了Android加載長圖的多種方案分享,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下

背景介紹

在某些特定場景下,我們需要考慮加載長圖的需求,比如加載一幅《清明上河圖》,這個好像有點過分了,那就加載1/2的《清明上河圖》吧... 那TMD還不是一樣道理。

言歸正傳說一下我這邊遇到的情況,之前有圖片或大圖的模塊是劃分為H5來實現(xiàn)的,現(xiàn)在需求變更劃分為原生開發(fā),那么問題就來了。

圖片尺寸為

圖片大小為

這一刻我是懵逼的,哪個端圖片上傳的時候沒限制尺寸和壓縮?mdzz, 吐槽歸吐槽,還是要擼起袖子解決加載長圖大圖的問題。 先提供幾個技術(shù)方案來對比一下:

方案1:WebView加載渲染

因為圖片本身也是一個URL地址,也是被WebView渲染,并且支持縮放。這是一種實現(xiàn)方案,遇到幾M的大圖WebView也是會崩潰Crash,所以這種投機的方式并不推薦。

方案2:BitmapRegionDecoder

分片加載,使用系統(tǒng)BitmapRegionDecoder去加載本地的圖片,調(diào)用bitmapRegionDecoder.decodeRegion解析圖片的矩形區(qū)域,返回bitmap,最終顯示在ImageView上。這種方案需要手動處理滑動、縮放手勢,網(wǎng)絡(luò)圖片還要處理緩存策略等問題。實現(xiàn)方式比較繁瑣也不是很推薦。

方案3:SubsamplingScaleImageView

一款封裝BitmapRegionDecoder的三方庫,已經(jīng)處理了滑動,縮放手勢。我們可以考慮選擇這個庫來進行加載長圖,但是官方上的Demo示例加載的長圖均為本地圖片。這可能并不符合我們的網(wǎng)絡(luò)場景需求,所以對于網(wǎng)絡(luò)圖片,我們還要考慮不同的加載框架,

SubsamplingScaleImageView Git傳送門

方案4:Glide+SubsamplingScaleImageView混合加載渲染

對于圖片加載框架,Glide當(dāng)然是首選,我們使用Glide進行網(wǎng)絡(luò)圖片的下載和緩存管理,F(xiàn)ileTarget作為橋梁,SubsamplingScaleImageView進行本地資源圖片的分片加載,看起來很靠譜,那么一起來實現(xiàn)吧。

Glide Git傳送門

SubsamplingScaleImageView Git傳送門

fun loadLargeImage(context: Context, res: String, imageView: SubsamplingScaleImageView) {
            imageView.isQuickScaleEnabled = true
            imageView.maxScale = 15F
            imageView.isZoomEnabled = true
            imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM)
           
            Glide.with(context).load(res).downloadOnly(object : SimpleTarget<File?>() {
                override fun onResourceReady(resource: File, glideAnimation: Transition<in File?>?) {
                    val sWidth = BitmapFactory.decodeFile(resource.absolutePath).width
                    val sHeight = BitmapFactory.decodeFile(resource.absolutePath).height
                    val wm = ContextCompat.getSystemService(context, WindowManager::class.java)
                    val width = wm?.defaultDisplay?.width ?: 0
                    val height = wm?.defaultDisplay?.height ?: 0
                    if (sHeight >= height
                            && sHeight / sWidth >= 3) {
                        imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP)
                        imageView.setImage(ImageSource.uri(Uri.fromFile(resource)), ImageViewState(0.5f, PointF(0f, 0f), 0))
                    } else {
                        imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM)
                        imageView.setImage(ImageSource.uri(Uri.fromFile(resource)))
                        imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER_IMMEDIATE)
                    }
                }
                override fun onLoadFailed(errorDrawable: Drawable?) {
                    super.onLoadFailed(errorDrawable)
                }
            })

        }

這是我封裝起來的一個方法,就很簡單就能理解了, 包括SubsamplingScaleImageView的縮放設(shè)置,默認(rèn)展示狀態(tài)、縮放、位置,計算當(dāng)前圖片高寬比為3倍進行長圖渲染處理,否則按正常圖片渲染處理。

最后快用下面的這張完整版《清明上河圖》來試一試效果吧~ 贊

以上就是Android加載長圖的多種方案分享的詳細內(nèi)容,更多關(guān)于Android加載長圖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論