美文网首页图片
Android加载长图方案

Android加载长图方案

作者: rivenlee | 来源:发表于2020-08-18 10:43 被阅读0次

背景介绍

在某些特定场景下,我们需要考虑加载长图的需求,比如加载一幅《清明上河图》,这个好像有点过分了,那就加载1/2的《清明上河图》吧... 那TMD还不是一样道理。

言归正传说一下我这边遇到的情况,之前有图片或大图的模块是划分为H5来实现的,现在需求变更划分为原生开发,那么问题就来了。图片尺寸为 image.png 图片大小为 image.png
这一刻我是懵逼的,哪个端图片上传的时候没限制尺寸和压缩?mdzz,
吐槽归吐槽,还是要撸起袖子解决加载长图大图的问题。

先提供几个技术方案来对比一下:

方案1:WebView加载渲染

因为图片本身也是一个URL地址,也是被WebView渲染,并且支持缩放。这是一种实现方案,遇到几M的大图WebView也是会崩溃Crash,所以这种投机的方式并不推荐。

方案2:BitmapRegionDecoder

分片加载,使用系统BitmapRegionDecoder去加载本地的图片,调用bitmapRegionDecoder.decodeRegion解析图片的矩形区域,返回bitmap,最终显示在ImageView上。这种方案需要手动处理滑动、缩放手势,网络图片还要处理缓存策略等问题。实现方式比较繁琐也不是很推荐。

方案3:SubsamplingScaleImageView

一款封装BitmapRegionDecoder的三方库,已经处理了滑动,缩放手势。我们可以考虑选择这个库来进行加载长图,但是官方上的Demo示例加载的长图均为本地图片。这可能并不符合我们的网络场景需求,所以对于网络图片,我们还要考虑不同的加载框架,

SubsamplingScaleImageView Git传送门
方案4:Glide+SubsamplingScaleImageView混合加载渲染

对于图片加载框架,Glide当然是首选,我们使用Glide进行网络图片的下载和缓存管理,FileTarget作为桥梁,SubsamplingScaleImageView进行本地资源图片的分片加载,看起来很靠谱,那么一起来实现吧。

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的缩放设置,默认展示状态、缩放、位置,计算当前图片高宽比为3倍进行长图渲染处理,否则按正常图片渲染处理。

最后快用下面的这张完整版《清明上河图》来试一试效果吧~ 赞

清明上河图_简书_爱吃大蒜.jpeg
如果我帮助你成功实现了加载长图的需求,千万要记得回来点赞哦,ღ( ´・ᴗ・` )比心

相关文章

  • Android加载长图方案

    背景介绍 在某些特定场景下,我们需要考虑加载长图的需求,比如加载一幅《清明上河图》,这个好像有点过分了,那就加载1...

  • Android自定义View实现加载大长图

    Android加载大长图 一、为什么Android加载图片要进行压缩? Android系统为app分配的内存是有限...

  • Android加载大图长图方案简析

    本文只是简要分析安卓端自带压缩与加载方案 1,高效加载加载大图 展示高分辨率图片的时候,最好先将图片进行压缩。 B...

  • Android加载大图和Lrucache 避免oom

    高效加载大图片 (转自)Android高效加载大图、多图解决方案,有效避免程序OOM BitmapFactory这...

  • Android加载长图

    Android系统对加载图片做了一些限制,其中一个就是对Bitmap有最大宽高限制,某些系统的机子的限制不一样,但...

  • Android 长图加载

    1.思考 我们拿到的长图,不可能一下就设置到对应的ImageView中,原因有二:1.图片显示不全2.一次性加载长...

  • 类加载流程

    Android类加载器继承关系 动态加载Dex方案一 动态加载Dex方案二 阅读原文

  • Android高效加载大图、多图解决方案,有效避免程序OOM

    Android高效加载大图、多图解决方案,有效避免程序OOM[https://blog.csdn.net/guol...

  • Android ImageView加载长图

    需求 一个Activity页面纯展示一张长图,看起来功能是简单的,可还是有些坑存在。记录一下。 坑 要做UI适配,...

  • 2018-11-07

    Android 加载长图片的自定义控件!解决安卓加载长图出现解码失败导致显示空白的问题! 关于解决超大图片超过bi...

网友评论

    本文标题:Android加载长图方案

    本文链接:https://www.haomeiwen.com/subject/iqdhjktx.html