Загрузите более высокое разрешение при масштабировании, предотвратите освобождение ресурса - PullRequest
0 голосов
/ 20 февраля 2019

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

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

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

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

1 Ответ

0 голосов
/ 20 февраля 2019

Решение на самом деле довольно простое.

Просто используйте два 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
                    }

                })
}
...