在缩放时加载更高分辨率,防止资源释放
Load higher res on zoom, prevent resource release
我想要完成的是使用默认大小(视图的大小)将图像加载到 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 在每次加载时释放资源(我很确定我在文档中找到了这一点)。
有没有办法在这种特定情况下阻止它?
我不想为上述目的使用缩略图功能,因为它每次都会为每张图像加载高分辨率图像(我宁愿只在缩放时这样做,以便用户真正受益于图像的其他细节) .
也许有一种我没有看到的完全不同的方法?
解决方法其实很简单。
只需使用两个 TouchImageView(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
}
})
}
我想要完成的是使用默认大小(视图的大小)将图像加载到 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 在每次加载时释放资源(我很确定我在文档中找到了这一点)。
有没有办法在这种特定情况下阻止它?
我不想为上述目的使用缩略图功能,因为它每次都会为每张图像加载高分辨率图像(我宁愿只在缩放时这样做,以便用户真正受益于图像的其他细节) .
也许有一种我没有看到的完全不同的方法?
解决方法其实很简单。
只需使用两个 TouchImageView(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
}
})
}