在缩放时加载更高的res,防止资源释放

问题描述 投票:0回答:1

我想要完成的是使用默认大小(视图的大小)滑动将图像加载到TouchImageView(https://github.com/MikeOrtiz/TouchImageView),然后在缩放时我想用更高的res替换位图。

我的方法:

 lang-java
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    imageView.setOnTouchImageViewListener {
        if (!zoomedIn && imageView.currentZoom == MAX_ZOOM) {
            zoomedIn = true
            loadImage(uri, Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
        }
    }

    loadImage(uri)
}

private fun loadImage(uri: Uri, width: Int = 0, height: Int = 0) {
    Glide.with(context)
            .asBitmap()
            .load(uri)
            .let {
                if (width == 0 && height == 0) {
                    it
                } else {
                    it.override(width, height)
                }
            }
            .centerInside()
            .into(imageView)
}

当加载更高分辨率的图像时,该实现会导致ImageView显示黑色背景。我认为这是因为Glide正在释放每个负载上的资源(我很确定我在文档中发现了这一点)。

有没有办法在这种特殊情况下阻止它?

我不希望使用缩略图功能用于上述目的,因为它每次都会为每个图像加载高分辨率图像(我更喜欢只在缩放时才能让用户真正受益于图像的其他细节)。

也许我没有看到完全不同的方法?

android bitmap android-glide touchimageview
1个回答
0
投票

解决方案实际上非常简单。

只需使用两个TouchImageViews(iv,ivhighres)并在加载高分辨率图像后替换它们。

如果要为更改设置动画,可以使用ViewSwitcher(如文档所示)。

请注意,您需要调用ivhighres.setZoom(iv)以将缩放属性从低分辨率图像镜像到高分辨率图像。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    iv.setOnTouchImageViewListener {
        ivhighres.setZoom(iv)
        if (!zoomedIn && imageView.currentZoom == MAX_ZOOM) {
            zoomedIn = true
            loadImageHighRes(uri)
        }
    }

    loadImage(uri)
}

private fun loadImage(uri: Uri) {
    Glide.with(context)
            .asBitmap()
            .load(uri)
            .centerInside()
            .into(iv)
}

private fun loadImageHighRes(uri: Uri) {
    Glide.with(context)
            .asBitmap()
            .load(uri)
            .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
            .centerInside()
            .into(object : CustomViewTarget<TouchImageView, Bitmap>(ivhighres) {
                    override fun onLoadFailed(errorDrawable: Drawable?) {
                    }

                    override fun onResourceCleared(placeholder: Drawable?) {
                        ivhighres?.setImageDrawable(placeholder)
                    }

                    override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                        ivhighres?.setImageBitmap(resource)
                        ivhighres?.visibility = View.VISIBLE
                        iv?.visibility = View.GONE
                    }

                })
}
© www.soinside.com 2019 - 2024. All rights reserved.