Manage ImageView load status through coil
Will implement retry later
This commit is contained in:
1 parent
473ff4d308
commit
bf651c7e40
3 files changed
+26
-91
No files matched your search
@@ -185,7 +185,7 @@ class EhApplication : Application(), DefaultLifecycleObserver, ImageLoaderFactor
|
||||
return ImageLoader.Builder(this).apply {
|
||||
okHttpClient(okHttpClient)
|
||||
components { add(MergeInterceptor) }
|
||||
crossfade(true)
|
||||
crossfade(300)
|
||||
}.build()
|
||||
}
|
||||
|
||||
|
||||
@@ -572,7 +572,7 @@ class GalleryDetailScene : CollapsingToolbarScene(), View.OnClickListener, Downl
|
||||
_binding ?: return
|
||||
val resources = resources
|
||||
binding.content.header.run {
|
||||
(thumb as LoadImageView).load(gd.thumb!!, true)
|
||||
(thumb as LoadImageView).load(gd.thumb!!, false)
|
||||
setTitle(EhUtils.getSuitableTitle(gd))
|
||||
uploader.text = gd.uploader
|
||||
if (gd.disowned) {
|
||||
@@ -727,14 +727,14 @@ class GalleryDetailScene : CollapsingToolbarScene(), View.OnClickListener, Downl
|
||||
for (i in 0 until previewSet.size()) {
|
||||
val view = inflater.inflate(R.layout.item_gallery_preview, gridLayout, false)
|
||||
val image = view.findViewById<LoadImageView>(R.id.image)
|
||||
previewSet.load(image, gd.gid, i)
|
||||
image.setTag(R.id.index, i)
|
||||
withUIContext {
|
||||
gridLayout.addView(view)
|
||||
image.setTag(R.id.index, i)
|
||||
image.setOnClickListener(this@GalleryDetailScene)
|
||||
val text = view.findViewById<TextView>(R.id.text)
|
||||
text.text = (previewSet.getPosition(i) + 1).toString()
|
||||
}
|
||||
previewSet.load(image, gd.gid, i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,15 +17,11 @@
|
||||
package com.hippo.widget
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.graphics.drawable.TransitionDrawable
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import androidx.annotation.IntDef
|
||||
import androidx.core.content.ContextCompat
|
||||
import coil.imageLoader
|
||||
import coil.load
|
||||
import coil.request.Disposable
|
||||
import coil.request.ImageRequest
|
||||
import coil.size.Size
|
||||
@@ -44,19 +40,6 @@ open class LoadImageView @JvmOverloads constructor(
|
||||
private var mRetryType: Int = 0
|
||||
private var mFailed: Boolean = false
|
||||
private var task: Disposable? = null
|
||||
private val imageDrawable: Drawable?
|
||||
get() {
|
||||
var drawable = drawable
|
||||
if (drawable is TransitionDrawable) {
|
||||
if (drawable.numberOfLayers == 2) {
|
||||
drawable = drawable.getDrawable(1)
|
||||
}
|
||||
}
|
||||
if (drawable is PreciselyClipDrawable) {
|
||||
drawable = drawable.wrappedDrawable
|
||||
}
|
||||
return drawable
|
||||
}
|
||||
|
||||
init {
|
||||
val a = context.obtainStyledAttributes(attrs, R.styleable.LoadImageView, defStyleAttr, 0)
|
||||
@@ -64,22 +47,6 @@ open class LoadImageView @JvmOverloads constructor(
|
||||
a.recycle()
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
if (mFailed) onFailure()
|
||||
else task?.run { if (isDisposed) reload() }
|
||||
}
|
||||
|
||||
override fun onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow()
|
||||
task?.dispose()
|
||||
clearDrawable()
|
||||
}
|
||||
|
||||
private fun clearDrawable() {
|
||||
setImageDrawable(null)
|
||||
}
|
||||
|
||||
private fun clearRetry() {
|
||||
if (mRetryType == RETRY_TYPE_CLICK) {
|
||||
setOnClickListener(null)
|
||||
@@ -127,63 +94,33 @@ open class LoadImageView @JvmOverloads constructor(
|
||||
mClipHeight = Integer.MIN_VALUE
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
fun load(url: String, isLoaded: Boolean = false) {
|
||||
if ((mRequest?.data as? String?) == url)
|
||||
return
|
||||
mFailed = false
|
||||
clearRetry()
|
||||
task?.dispose()
|
||||
mRequest =
|
||||
ImageRequest.Builder(context).data(url).crossfade(false)
|
||||
.size(Size.ORIGINAL).target(
|
||||
{ onWait() },
|
||||
{ onFailure() },
|
||||
{ onGetValue(it, isLoaded) }
|
||||
).build().also { load(it) }
|
||||
}
|
||||
|
||||
fun load(request: ImageRequest) {
|
||||
task = context.imageLoader.enqueue(request)
|
||||
}
|
||||
|
||||
private fun reload() {
|
||||
mRequest?.let { load(it) }
|
||||
}
|
||||
|
||||
|
||||
private fun onWait() {
|
||||
mFailed = false
|
||||
clearDrawable()
|
||||
}
|
||||
|
||||
private fun onGetValue(drawable: Drawable, isLoaded: Boolean) {
|
||||
var drawable = drawable
|
||||
clearDrawable()
|
||||
|
||||
if (Integer.MIN_VALUE != mOffsetX) {
|
||||
drawable = PreciselyClipDrawable(drawable, mOffsetX, mOffsetY, mClipWidth, mClipHeight)
|
||||
fun load(url: String, crossfade: Boolean = true) {
|
||||
load(url) {
|
||||
size(Size.ORIGINAL)
|
||||
if (!crossfade) crossfade(false)
|
||||
}
|
||||
}
|
||||
|
||||
onPreSetImageDrawable(drawable, true)
|
||||
if (isShown && !isLoaded) {
|
||||
val layers = arrayOfNulls<Drawable>(2)
|
||||
layers[0] = ColorDrawable(Color.TRANSPARENT)
|
||||
layers[1] = drawable
|
||||
val transitionDrawable = TransitionDrawable(layers)
|
||||
setImageDrawable(transitionDrawable)
|
||||
transitionDrawable.startTransition(300)
|
||||
} else {
|
||||
setImageDrawable(drawable)
|
||||
override fun setImageDrawable(drawable: Drawable?) {
|
||||
var newDrawable = drawable
|
||||
if (newDrawable != null) {
|
||||
if (Integer.MIN_VALUE != mOffsetX) {
|
||||
newDrawable = PreciselyClipDrawable(drawable, mOffsetX, mOffsetY, mClipWidth, mClipHeight)
|
||||
}
|
||||
onPreSetImageDrawable(newDrawable, true)
|
||||
}
|
||||
super.setImageDrawable(newDrawable)
|
||||
}
|
||||
|
||||
override fun getDrawable(): Drawable? {
|
||||
var newDrawable = super.getDrawable()
|
||||
if (newDrawable is PreciselyClipDrawable) {
|
||||
newDrawable = newDrawable.wrappedDrawable
|
||||
}
|
||||
return newDrawable
|
||||
}
|
||||
|
||||
fun onFailure() {
|
||||
mFailed = true
|
||||
clearDrawable()
|
||||
val drawable = ContextCompat.getDrawable(context, R.drawable.image_failed)
|
||||
onPreSetImageDrawable(drawable, true)
|
||||
setImageDrawable(drawable)
|
||||
when (mRetryType) {
|
||||
RETRY_TYPE_CLICK -> {
|
||||
setOnClickListener(this)
|
||||
@@ -200,11 +137,9 @@ open class LoadImageView @JvmOverloads constructor(
|
||||
}
|
||||
|
||||
override fun onClick(v: View) {
|
||||
reload()
|
||||
}
|
||||
|
||||
override fun onLongClick(v: View): Boolean {
|
||||
reload()
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user