Glide, TouchImageView - увеличивайте разрешение при увеличении, предотвращайте освобождение ресурса

То, что я хочу сделать, это загрузить изображение в TouchImageView ( https://github.com/MikeOrtiz/TouchImageView) с глиссингом, используя размер по умолчанию (размер представления), а затем при увеличении я хотел бы заменить растровое изображение с более высоким разрешением.

Мой подход:

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 высвобождает ресурсы при каждой загрузке (я почти уверен, что нашел это в документации).

Есть ли способ предотвратить это в этом конкретном сценарии?

Я не хочу использовать функцию "Миниатюра" для вышеуказанной цели, поскольку она будет загружать изображение с высоким разрешением каждый раз для каждого изображения (я бы предпочел делать это только при увеличении для пользователя, чтобы фактически извлечь выгоду из дополнительных деталей изображения).

Может быть, есть совершенно другой подход, который я не вижу?

Благодарю.

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
                    }

                })
}
Другие вопросы по тегам