Lädt dynamisch ein AnimationDrawable in einer TextView

8

Ich muss Textstellen in a mit Bildern ersetzen und dann an eine TextView anhängen. Für reguläre Drawables ist das kein Problem, aber wenn Drawable ein Animation Drawable ist, weiß ich nicht, wo und wann .start(); aufgerufen werden soll.

So füge ich Text an die TextView an:

%Vor%

Die Bild-Tags in den textWithHtmlImgTags werden durch imagegetter ersetzt:

%Vor%

Meine AnimationDrawables werden hinzugefügt, aber sie sind nicht animiert (sie hängen an Bild 1).

In der Dokumentation heißt es:

  

Es ist wichtig zu beachten, dass die für AnimationDrawable aufgerufene Methode start () nicht während der Methode onCreate () Ihrer Aktivität aufgerufen werden kann, da AnimationDrawable noch nicht vollständig an das Fenster angefügt ist. Wenn Sie die Animation sofort wiedergeben möchten, ohne dass eine Interaktion erforderlich ist, können Sie sie über die onWindowFocusChanged () - Methode in Ihrer Activity aufrufen, die aufgerufen wird, wenn Android Ihr Fenster scharfstellt.

Da die Bilder dynamisch hinzugefügt werden, glaube ich nicht, dass es etwas mit onCreate () zu tun hat. Also ich rufe ich meine .start() , wenn meine% code_% zeichnen, aber wo / wann / wie sollte ich es nennen?

Vielen Dank im Voraus!

    
T.S. 23.02.2012, 17:58
quelle

3 Antworten

6
___ qstnhdr ___ Lädt dynamisch ein AnimationDrawable in einer TextView ___ answer14842757 ___

View implementiert bereits Drawable.Callback, sodass Sie nur die folgenden TextView-Überschreibungen benötigen, um AnimationDrawable-Objekte in einem ImageSpan anzuzeigen:

%Vor%

Das Überschreiben von verifyDrawable ist erforderlich, damit die Superklassenimplementierungen von Drawable.Callback unerwartete Drawable-Objekte akzeptieren und die Zeitplanung verarbeiten.

Das Aufrufen von onLayout zwingt die TextView, ihre zwischengespeicherte Anzeigeliste ungültig zu machen, andernfalls werden die aktualisierten Frames nicht gezeichnet.

Ich fand auch, dass aus irgendeinem Grund, wenn ich den ImageSpan mit Bezug auf die Animationsressourcen-ID erstellte, die Ressource nicht zwischengespeichert wurde und jedes Mal neu geladen zu werden schien, wenn ImageSpan.getDrawable () aufgerufen wurde. Durch das Laden der Ressource, das Festlegen ihrer Grenzen und das Übergeben an den ImageSpan-Konstruktor habe ich dieses Problem vermieden.

Verwenden Sie onAttachedToWindow / onDetachedFromWindow wie anders vorgeschlagen.

    
___ tag123animation ___ Animation ist die schnelle Anzeige einer Sequenz von Bildern, um eine Illusion von Bewegung oder Veränderung zu erzeugen. ___ answer10237547 ___

Ich denke, die wichtige Frage ist: wann machst du den Anruf?

%Vor%

Wenn Sie dies nach onCreate aufrufen, können Sie den animation.start () aufrufen. Wenn es in onCreate () -Methode aufgerufen wird, würde ich:

  • speichert die Liste der in ImageGetter generierten Zeichenbilder;
  • rufe start () für alle Zeichen in onAttachedToWindow oder onStart auf (nicht sicher, ob sie in der onStart-Funktion funktionieren)
___ tag123drawable ___ Ein Drawable ist ein grafischer Begriff, der im Allgemeinen "etwas zu zeichnen" bedeutet. ___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ qstntxt ___

Ich muss Textstellen in a mit Bildern ersetzen und dann an eine TextView anhängen. Für reguläre Drawables ist das kein Problem, aber wenn Drawable ein Animation Drawable ist, weiß ich nicht, wo und wann %code% aufgerufen werden soll.

So füge ich Text an die TextView an:

%Vor%

Die Bild-Tags in den textWithHtmlImgTags werden durch imagegetter ersetzt:

%Vor%

Meine AnimationDrawables werden hinzugefügt, aber sie sind nicht animiert (sie hängen an Bild 1).

In der Dokumentation heißt es:

  

Es ist wichtig zu beachten, dass die für AnimationDrawable aufgerufene Methode start () nicht während der Methode onCreate () Ihrer Aktivität aufgerufen werden kann, da AnimationDrawable noch nicht vollständig an das Fenster angefügt ist. Wenn Sie die Animation sofort wiedergeben möchten, ohne dass eine Interaktion erforderlich ist, können Sie sie über die onWindowFocusChanged () - Methode in Ihrer Activity aufrufen, die aufgerufen wird, wenn Android Ihr Fenster scharfstellt.

Da die Bilder dynamisch hinzugefügt werden, glaube ich nicht, dass es etwas mit onCreate () zu tun hat. Also ich rufe ich meine %code% , wenn meine% code_% zeichnen, aber wo / wann / wie sollte ich es nennen?

Vielen Dank im Voraus!

    
___ antwort10240408 ___

Ich kam mit der Lösung heraus. In Ihrem benutzerdefinierten TextView:

(1) Zuerst müssen Sie den Zeitpunkt für das Starten und Stoppen der Animation festlegen.

%Vor%

(2) Und dann implementieren Sie Ihre eigenen Drawable.Callback, um das Neuzeichnen auszulösen.

%Vor%     
___
shiami 20.04.2012, 04:46
quelle
1

Ich denke, die wichtige Frage ist: wann machst du den Anruf?

%Vor%

Wenn Sie dies nach onCreate aufrufen, können Sie den animation.start () aufrufen. Wenn es in onCreate () -Methode aufgerufen wird, würde ich:

  • speichert die Liste der in ImageGetter generierten Zeichenbilder;
  • rufe start () für alle Zeichen in onAttachedToWindow oder onStart auf (nicht sicher, ob sie in der onStart-Funktion funktionieren)
Siyamed 19.04.2012 22:10
quelle
1

View implementiert bereits Drawable.Callback, sodass Sie nur die folgenden TextView-Überschreibungen benötigen, um AnimationDrawable-Objekte in einem ImageSpan anzuzeigen:

%Vor%

Das Überschreiben von verifyDrawable ist erforderlich, damit die Superklassenimplementierungen von Drawable.Callback unerwartete Drawable-Objekte akzeptieren und die Zeitplanung verarbeiten.

Das Aufrufen von onLayout zwingt die TextView, ihre zwischengespeicherte Anzeigeliste ungültig zu machen, andernfalls werden die aktualisierten Frames nicht gezeichnet.

Ich fand auch, dass aus irgendeinem Grund, wenn ich den ImageSpan mit Bezug auf die Animationsressourcen-ID erstellte, die Ressource nicht zwischengespeichert wurde und jedes Mal neu geladen zu werden schien, wenn ImageSpan.getDrawable () aufgerufen wurde. Durch das Laden der Ressource, das Festlegen ihrer Grenzen und das Übergeben an den ImageSpan-Konstruktor habe ich dieses Problem vermieden.

Verwenden Sie onAttachedToWindow / onDetachedFromWindow wie anders vorgeschlagen.

    
Greg 12.02.2013 22:09
quelle

Tags und Links