Android加載長(zhǎng)圖的多種方案分享
背景介紹
在某些特定場(chǎng)景下,我們需要考慮加載長(zhǎng)圖的需求,比如加載一幅《清明上河圖》,這個(gè)好像有點(diǎn)過分了,那就加載1/2的《清明上河圖》吧... 那TMD還不是一樣道理。
言歸正傳說一下我這邊遇到的情況,之前有圖片或大圖的模塊是劃分為H5來實(shí)現(xiàn)的,現(xiàn)在需求變更劃分為原生開發(fā),那么問題就來了。
圖片尺寸為
圖片大小為
這一刻我是懵逼的,哪個(gè)端圖片上傳的時(shí)候沒限制尺寸和壓縮?mdzz, 吐槽歸吐槽,還是要擼起袖子解決加載長(zhǎng)圖大圖的問題。 先提供幾個(gè)技術(shù)方案來對(duì)比一下:
方案1:WebView加載渲染
因?yàn)閳D片本身也是一個(gè)URL地址,也是被WebView渲染,并且支持縮放。這是一種實(shí)現(xiàn)方案,遇到幾M的大圖WebView也是會(huì)崩潰Crash,所以這種投機(jī)的方式并不推薦。
方案2:BitmapRegionDecoder
分片加載,使用系統(tǒng)BitmapRegionDecoder去加載本地的圖片,調(diào)用bitmapRegionDecoder.decodeRegion解析圖片的矩形區(qū)域,返回bitmap,最終顯示在ImageView上。這種方案需要手動(dòng)處理滑動(dòng)、縮放手勢(shì),網(wǎng)絡(luò)圖片還要處理緩存策略等問題。實(shí)現(xiàn)方式比較繁瑣也不是很推薦。
方案3:SubsamplingScaleImageView
一款封裝BitmapRegionDecoder的三方庫(kù),已經(jīng)處理了滑動(dòng),縮放手勢(shì)。我們可以考慮選擇這個(gè)庫(kù)來進(jìn)行加載長(zhǎng)圖,但是官方上的Demo示例加載的長(zhǎng)圖均為本地圖片。這可能并不符合我們的網(wǎng)絡(luò)場(chǎng)景需求,所以對(duì)于網(wǎng)絡(luò)圖片,我們還要考慮不同的加載框架,
SubsamplingScaleImageView Git傳送門
方案4:Glide+SubsamplingScaleImageView混合加載渲染
對(duì)于圖片加載框架,Glide當(dāng)然是首選,我們使用Glide進(jìn)行網(wǎng)絡(luò)圖片的下載和緩存管理,F(xiàn)ileTarget作為橋梁,SubsamplingScaleImageView進(jìn)行本地資源圖片的分片加載,看起來很靠譜,那么一起來實(shí)現(xiàn)吧。
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) } }) }
這是我封裝起來的一個(gè)方法,就很簡(jiǎn)單就能理解了, 包括SubsamplingScaleImageView的縮放設(shè)置,默認(rèn)展示狀態(tài)、縮放、位置,計(jì)算當(dāng)前圖片高寬比為3倍進(jìn)行長(zhǎng)圖渲染處理,否則按正常圖片渲染處理。
最后快用下面的這張完整版《清明上河圖》來試一試效果吧~ 贊
以上就是Android加載長(zhǎng)圖的多種方案分享的詳細(xì)內(nèi)容,更多關(guān)于Android加載長(zhǎng)圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android如何使用Glide加載清晰長(zhǎng)圖
- android實(shí)現(xiàn)長(zhǎng)圖加載效果
- Android仿微博加載長(zhǎng)圖滾動(dòng)查看效果
- Android 官推 kotlin-first 的圖片加載庫(kù)——Coil的使用入門
- Android如何加載Base64編碼格式圖片
- Android Fresco圖片加載優(yōu)化的方案
- Android實(shí)現(xiàn)圖片加載進(jìn)度提示
- Android適配利用webview加載后圖片顯示過大的問題解決
- Android框架Volley之利用Imageloader和NetWorkImageView加載圖片的方法
- Android框架Volley使用:ImageRequest請(qǐng)求實(shí)現(xiàn)圖片加載
- Android高效安全加載圖片的方法詳解
相關(guān)文章
Android項(xiàng)目開發(fā)之UI設(shè)計(jì)器
這篇文章主要為大家詳細(xì)介紹了Android項(xiàng)目開發(fā)之UI設(shè)計(jì)器,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android 簡(jiǎn)單的彈出框(在屏幕中間,傳string[],根據(jù)內(nèi)容框框大小自適應(yīng))
這篇文章主要介紹了Android 簡(jiǎn)單的彈出框(在屏幕中間,傳string[],根據(jù)內(nèi)容框框大小自適應(yīng)),需要的朋友可以參考下2017-04-04Android數(shù)據(jù)共享 sharedPreferences 的使用方法
這篇文章主要介紹了Android數(shù)據(jù)共享 sharedPreferences 的使用方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解使用sharedpreferences,需要的朋友可以參考下2017-10-10Android中對(duì)RecyclerView Adapter封裝解析
本篇文章主要介紹了Android中對(duì)RecyclerView Adapter封裝解析。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06Android編程實(shí)現(xiàn)短信收發(fā)及語(yǔ)音播報(bào)提示功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)短信收發(fā)及語(yǔ)音播報(bào)提示功能,結(jié)合實(shí)例形式分析了Android實(shí)現(xiàn)短信的接收、發(fā)送以及相應(yīng)的語(yǔ)音播報(bào)提示功能相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android開發(fā)之多線程中實(shí)現(xiàn)利用自定義控件繪制小球并完成小球自動(dòng)下落功能實(shí)例
這篇文章主要介紹了Android開發(fā)之多線程中實(shí)現(xiàn)利用自定義控件繪制小球并完成小球自動(dòng)下落功能的方法,涉及Android多線程編程及圖形繪制相關(guān)技巧,需要的朋友可以參考下2015-12-12Android實(shí)現(xiàn)錄音功能實(shí)現(xiàn)實(shí)例(MediaRecorder)
本篇文章主要介紹了Android實(shí)現(xiàn)錄音的實(shí)例代碼(MediaRecorder),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07