开发婚恋系统源码,如何实现长图的加载

背景介绍

在婚恋系统源码的某些特定场景下,我们需要考虑加载长图的需求,比如加载一幅《清明上河图》,这个好像有点过分了,那就加载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 options = BitmapFactory.Options()
                    options.inJustDecodeBounds = true
                    BitmapFactory.decodeFile(resource.absolutePath, options)
                    val sWidth = options.outWidth
                    val sHeight = options.outHeight
                    options.inJustDecodeBounds = false
                    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

这样,婚恋系统源码就能成功加载长图啦。

声明:本文由云豹科技转发自rivenlee博客,如有侵权请联系作者删除

1、这个软件使用C#编写,需要.NET Framework 4.0运行环境。 2、建议“新建文件夹”来保存分割后的图片,因为程序会自动清空该文件夹下所有文件。 3、这个软件可以对图片进行,行与列的分割。如果大家按块对图片进行行分割,那么分割列数填写1,分割行书填写自己要分割的行;如果大家按块数想对列分割,那么分割列数填写要分割的列数,分割行数填写1。如果大家按像素对图片进行横向切割,那么像素宽度填写1,高度随便写;如果按像素对图片进行纵向切割,那么像素高度填写1,像素宽度随便写。 4、分割图片的耗时跟图片大小、切割块数的多少有直接关系。另外,图片在切割的时候无论何种切割方式都是将图片读取到内存中进行切割,所以注意一下自己机器内存的大小,以及图片的大小。以免内存报错。 5、从网上直接加载图片时候,图片类型只能为jpg或者png格式,其他类型的图片暂不支持。另外,在输入时一定要输入“http://”或"https://",输入完毕后按回车键。 6、图片九宫格合并,主要在文件的命名上,文件名以数字开头,类似于“0_0.jpg”这样的文件名,其中第一个0代表行,第二个0代表列,0_0这样的文件名是指第一行,第一张图片,0_1是指第一行,第二张图片,0_2是指第一行,第三张图片以此类推。具体看文章上方关于九宫格的图片说明。 7、由于程序在编译的时候使用了代码保护软件进行保护,所以在运行的时候360之类的软件会有报警,如果大家很在意360之类的报警提示的话。那就绕行吧。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值