编程知识 cdmana.com

Résolution du problème de clignotement de l'image de chargement glide

Le même ImageView Clignote une fois en changeant l'affichage de l'image placeHolder,Si placeHolder Si vide, l'arrière - plan clignotera,Pour deux raisons::

  1. into La méthode annule le dernier chargement,Enfin appelé à [Target.onLoadCleared] Méthodes,Si c'est direct into(ImageView),Le diagramme original sera vide et défini placeHolder, En cas d'héritage [CustomViewTarget],Puis il est appelé à [CustomViewTarget.onResourceLoading];
  2. [ImageViewTarget.onLoadStarted] L'image originale sera vide et réglée placeHolder.

Mais il y a des scènes où on ne veut pas placeHolder De.Il faut donc choisir d'utiliser ou non placeHolder Capacité de,Si placeHolder Pas vide,Sera utilisé placeHolder,Si elle est vide, elle n'est pas utilisée,En ce moment ImageView Le dernier graphique chargé est affiché,Jusqu'à ce que le diagramme actuel soit chargé ou que le chargement échoue.

abstract class SeamlessImageViewTarget<Z>(view: ImageView) : CustomViewTarget<ImageView, Z>(view), ViewAdapter {
    private var animatable: Animatable? = null

    override fun onStart() {
        animatable?.start()
    }

    override fun onStop() {
        animatable?.stop()
    }

    override fun getCurrentDrawable(): Drawable? = view.drawable

    override fun setDrawable(drawable: Drawable?) {
        view.setImageDrawable(drawable)
    }

    override fun onLoadFailed(errorDrawable: Drawable?) {
        setResourceInternal(null)
        setDrawable(errorDrawable)
    }

    override fun onResourceLoading(placeholder: Drawable?) {
        super.onResourceLoading(placeholder)
        // placeholder  Si vide, ne pas définir , L'image précédente est affichée 
        placeholder?.let { setDrawable(placeholder) }
    }

    override fun onResourceReady(resource: Z, transition: Transition<in Z>?) {
        if (transition == null || !transition.transition(resource, this)) {
            setResourceInternal(resource)
        } else {
            maybeUpdateAnimatable(resource)
        }
    }

    override fun onResourceCleared(placeholder: Drawable?) {
        animatable?.stop()
        // placeholder  Si vide, ne pas définir , L'image précédente est affichée 
        placeholder?.let { setDrawable(placeholder) }
    }

    private fun setResourceInternal(resource: Z?) {
        // Order matters here. Set the resource first to make sure that the Drawable has a valid and
        // non-null Callback before starting it.
        setResource(resource)
        maybeUpdateAnimatable(resource)
    }

    private fun maybeUpdateAnimatable(resource: Z?) {
        animatable = if (resource is Animatable) {
            resource.apply { start() }
        } else {
            null
        }
    }

    protected abstract fun setResource(resource: Z?)
}

class SeamlessBitmapImageViewTarget(view: ImageView) : SeamlessImageViewTarget<Bitmap>(view) {
    override fun setResource(resource: Bitmap?) {
        view.setImageBitmap(resource)
    }
}

class SeamlessDrawableImageViewTarget(view: ImageView) : SeamlessImageViewTarget<Drawable>(view) {
    override fun setResource(resource: Drawable?) {
        view.setImageDrawable(resource)
    }
}
Copier le Code

版权声明
本文为[Sable mouvant Panax notoginseng]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/11/20211125175101853m.html

Scroll to Top