【问题标题】:Load higher res on zoom, prevent resource release缩放时加载更高的分辨率,防止资源释放
【发布时间】:2019-03-24 21:13:53
【问题描述】:

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

我的做法:

 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】:

    解决方案其实很简单。

    只需使用两个 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
                        }
    
                    })
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多