8
votes

Charger de manière dynamique une animationDrawable dans un TextView

J'ai besoin de remplacer les phrases du texte en A avec des images, puis appendez-le à un TextView. Pour les érables réguliers, ce n'est pas un problème, mais lorsque le digage est une animationDrawable, je ne sais pas où et quand appeler .start (); code> : p> xxx pré>

Les balises d'image dans le textewithhtmlimgTags sont remplacées à l'aide d'ImageGetter: P>

new ImageGetter()
{
    @Override
    public Drawable getDrawable(String source) {

        if(source.endsWith("_ani"))
        {
            Log.i("cmv", "This is an animated drawable.");

            AnimationDrawable dra = (AnimationDrawable)res.getDrawable(sRes.get(source));
            dra.setBounds(0, 0, dra.getIntrinsicWidth(), dra.getIntrinsicHeight());
            dra.start(); // This doesn't work..

            return dra;
        }

        Drawable dr = res.getDrawable(sRes.get(source));
        dr.setBounds(0, 0, dr.getIntrinsicWidth(), dr.getIntrinsicHeight());
        return dr;
    }

};


1 commentaires

Après avoir défini l'appel des tirettes d'appel textview.bringtofront () puis appelle .start () pour animer ..


3 Réponses :


1
votes

Je suppose que la question importante est la suivante: quand faites-vous l'appel? XXX

Si vous l'appelez après Oncreate, vous pouvez appeler l'animation.Start (). S'il est appelé à la méthode oncreate (), je voudrais:

  • Conservez la liste des tiroirs générés dans ImageGetter;
  • Appelez démarrez () sur tous les tiroirs à OnattachedTowindow ou OnStart (pas sûr de fonctionner si elles fonctionnent dans la fonction OnStart)

1 commentaires

Je fais l'appel plusieurs fois, le premier appel est à ONCREATE. Après cela, il s'appelle plusieurs fois plus (chaque fois que l'application reçoit une réponse d'un serveur). J'ai essayé de garder une liste de tous les animationsDawables et de les commencer surtachedtowindow, mais ils restent toujours bloqués sur la première image.



6
votes

Je suis sorti avec la solution. Dans votre TextView personnalisé:

(1) Tout d'abord, vous devez choisir la synchronisation du début et de l'arrêt de l'animation. xxx

(2) puis mettez en œuvre votre propre introduction .Callback pour déclencher le redessinage. xxx


1 commentaires

Super! C'est exactement ce dont j'avais besoin!



1
votes

Voir déjà implémente drawable.Callback Vous n'avez besoin que des substitutions TextViews suivantes pour afficher des objets d'animationDrawable dans une imagepan:

//  comparing against drawables found in the spans is probably safer
@Override
protected boolean verifyDrawable(Drawable who) {
    return (super.verifyDrawable(who) || who instanceof AnimationDrawable);
}

//  again comparing against drawables found in the spans is probably safer
@Override
public void invalidateDrawable(Drawable drawable) {
    if (drawable instanceof AnimationDrawable) {
        onLayout(true, getLeft(), getTop(), getRight(), getBottom());
        invalidate();
        return;
    }
    super.invalidateDrawable(drawable);
}


0 commentaires