So fügen Sie ein animiertes Emoticon in TextView oder EditText in Android hinzu

8

Als Frage verwende ich ImageSpan, um ein Bild in TextView einzufügen. aber es kann nicht animieren. Haben Sie irgendwelche Ratschläge? Ich versuche, AnimationDrawable so zu erweitern, dass es in ImageSpan ziehbar ist. aber es funktioniert nicht

%Vor%     
Stay 26.12.2011, 03:52
quelle

2 Antworten

22

Ich würde versuchen, entweder:

  • Teilen Sie das animierte Bild (vermutlich eine .gif-Datei?) in separate Frames und kombinieren Sie diese zu einem AnimationDrawable , die Sie dann an den ImageSpan-Konstruktor übergeben.
  • Unterklasse ImageSpan und überschreiben Sie die Methode onDraw() , um Ihre eigene Logik hinzuzufügen, um die verschiedenen Frames basierend auf einer Art Timer zu zeichnen. Es gibt eine API-Demo, die zeigt, wie man mit der Movie-Klasse ein animiertes Gif laden kann, das einen Blick wert ist.

Große Bearbeitung: In Ordnung, tut mir leid, dass ich nicht früher zurück gekommen bin, aber ich musste mir etwas Zeit nehmen, um das selbst zu untersuchen. Ich habe damit gespielt, da ich wahrscheinlich selbst eine Lösung für eines meiner zukünftigen Projekte brauche. Leider stieß ich auf ähnliche Probleme bei der Verwendung von AnimationDrawable , was anscheinend auf den Caching-Mechanismus zurückzuführen ist, den DynamicDrawableSpan (eine indirekte Oberklasse von ImageSpan ) verwendet.

Ein weiteres Problem für mich ist, dass es anscheinend keinen einfachen Weg gibt, um Drawable oder ImageSpan zu entwerten. Drawable hat tatsächlich invalidateDrawable(Drawable) und invalidateSelf() Methoden, aber die erste hatte in meinem Fall keine Wirkung, während letztere nur funktioniert, wenn ein magischer Drawable.Callback angehängt ist. Ich konnte keine anständige Dokumentation darüber finden, wie man das benutzt ...

Also ging ich einen Schritt weiter den Logikbaum hinauf, um das Problem zu lösen. Ich muss im Voraus eine Warnung hinzufügen, dass dies wahrscheinlich keine optimale Lösung ist, aber für jetzt ist es die einzige, die ich zur Arbeit bekommen konnte. Sie werden wahrscheinlich nicht auf Probleme stoßen, wenn Sie meine Lösung sporadisch verwenden, aber ich würde vermeiden, den ganzen Bildschirm mit Emoticons auf alle Fälle zu füllen. Ich bin mir nicht sicher, was passieren würde, aber andererseits möchte ich es wahrscheinlich nicht einmal wissen.

Ohne weitere Umschweife, hier ist der Code. Ich habe einige Kommentare hinzugefügt, um es selbsterklärend zu machen. Es ist sehr wahrscheinlich, dass eine andere Gif-Dekodierungsklasse / Bibliothek verwendet wurde, aber es sollte mit irgendjemandem da draußen funktionieren.

AnimatedGifDrawable.java

%Vor%

AnimatedImageSpan.java

%Vor%

Verwendung:

%Vor%

Wie Sie sehen können, habe ich einen Handler verwendet, um die "Ticks" bereitzustellen, um zum nächsten Frame zu gelangen. Dies hat den Vorteil, dass nur dann ein Update ausgelöst wird, wenn ein neuer Frame gerendert werden soll. Das tatsächliche Neuzeichnen wird durchgeführt, indem das TextView, das den AnimatedImageSpan enthält, ungültig gemacht wird. Zur gleichen Zeit ist der Nachteil, dass, wenn Sie eine Reihe von animierten Gifs in der gleichen TextView (oder mehrere für diese Angelegenheit) haben, die Ansichten möglicherweise aktualisiert werden wie verrückt ... Verwenden Sie es mit Bedacht. :)

    
MH. 26.12.2011 04:23
quelle
2

Sie können ObjectAnimator verwenden, um das Zeichen im ImageSpan

zu animieren

Ссылка

    
Rajdeep Dua 26.12.2011 04:20
quelle

Tags und Links