2012-10-31 4 views
7

Ich habe über Property Animation und Hardware Acceleration gelesen, aber ich bin immer noch unsicher, was der effizienteste Weg ist, die Animator-Klassen zu verwenden. (Für diese Frage muss ich keine Geräte vor Honeycomb unterstützen. Also möchte ich die Animator-Klassen verwenden.)Wie kann ein Drawable in einer Ansicht mithilfe der Animatorklassen optimal animiert werden?

Zum Beispiel sagen, ich habe eine Ansicht. In dieser Ansicht habe ich eine BitmapDrawable, die ich einblenden möchte. Es gibt auch viele andere Elemente in der Ansicht, die sich nicht ändern.

Welche Eigenschaft oder Objekt würde am besten mit dem Animator verwendet werden? Das Zeichenbare? Eine Farbe, mit der ich die Bitmap in onDraw zeichne? Etwas anderes?

Wie kann dies getan werden, um mit Hardwarebeschleunigung am effizientesten zu sein? Wird für jeden Schritt der Animation ein ungültiger Aufruf erforderlich sein oder gibt es eine Möglichkeit, nur das Zeichenfeld zu animieren und nicht den Rest der Ansicht für jeden Schritt der Animation vollständig neu zu zeichnen?

Ich denke, ich stelle mir vor, ein optimaler Fall wäre der Rest der Ansicht nicht komplett in Software neu gezeichnet werden, sondern Hardware-Beschleunigung effizient das Zeichnen der Zeichen.

Irgendwelche Vorschläge oder Hinweise zu empfohlenen Ansätzen?

Danke!

+0

Nun, ich denke, Sie fragen das, weil es Probleme verursacht. Die Animation wird wahrscheinlich alles ungültig machen, aber wir finden möglicherweise eine Problemumgehung, wenn Sie uns die Ansichtshierarchie zeigen, die Sie haben. Bitte geben Sie an, was Sie darin animieren. –

+0

Nein, habe noch nichts geschrieben, nur versucht, alle Informationen zu bekommen, bevor ich es tue. :) – cottonBallPaws

+0

Nun, wenn die Animation auf durchschnittlichen Geräten funktioniert, dann sind wir in Ordnung. Wenn es jedoch merklich schwer ist, selbst nach den üblichen Verbesserungen wie der Hardwarebeschleunigung (die möglicherweise nicht immer verfügbar ist), sollte man seine eigene Lösung finden. Wenn Sie beispielsweise einen Hintergrund animieren, der die Ungültigkeit Ihrer gesamten Hierarchie verursacht, erstellen Sie einen Snapshot der Hierarchie und animieren den Hintergrund dahinter. Wie auch immer, es ist im Wesentlichen Ihre Entscheidung, ob Sie sich Mühe geben, da es wahrscheinlich mit Hardwarebeschleunigung und auf den meisten Geräten funktionieren wird. (hoffnungsvoll :) –

Antwort

4

Mit der Verwendung der Object Property Animators sind dies im Grunde nur mathematische Funktionen, die wiederholt eine "setN()" -Methode alle X Millisekunden aufrufen, wobei "N" die Eigenschaft ist, die Sie ändern möchten.

In dem im Fall von Alpha bereitgestellten Beispiel würden beide einen Aufruf an invalidate() erfordern, um die Ansicht neu zu zeichnen, die Sie animieren. Der Unterschied ist, wenn Sie setAlpha() auf dem View Objekt aufrufen, ruft es invalidate() für Sie auf. Wenn Sie das Zielobjekt auf das Objekt Paint setzen, das zum Zeichnen des Zeichenobjekts verwendet wird, müssen Sie weiterhin invalidate() auf dem View aufrufen, damit es mit den neuen Parametern Paint neu gezeichnet wird.

Idealerweise möchten Sie das Ziel auf das untergeordnete Element der höchsten Ebene setzen, damit das Neuzeichnen nur für die Ansichten erfolgt, die Sie animieren möchten. Wenn Sie das Ziel beispielsweise auf die Stammansicht setzen, ruft es für jedes Kind in der gesamten ViewGroup invalidate() auf, das wiederum für jedes Kind in der ViewGroup draw() aufruft. Wenn Sie es auf eine oberste Ebene ImageView setzen, wird nur ImageView neu gezeichnet.

Um die Hardware optimal zu nutzen, müssen Sie die Layer-Eigenschaften verwenden. Zuerst müssen Sie entscheiden, was die oberste übergeordnete Ansicht sein soll, die Sie animieren möchten. Wenn Sie nur die Drawable verblassen wollen, dann ist es die Drawable oder die View enthält. Wenn Sie alles ausblenden möchten, wird es die Grundansicht sein. Was auch immer Sie sich entscheiden zu animieren, wird auf die View als Ganzes gleichzeitig angewendet.

Verwenden Sie setLayerType() in der übergeordneten Ansicht, kurz bevor Sie den Animator starten. Setzen Sie es auf View#LAYER_TYPE_HARDWARE. Setzen Sie dann AnimationListener und setzen Sie den LayerType nach Abschluss des Animators auf View#LAYER_TYPE_SOFTWARE oder View#LAYER_TYPE_NONE zurück.

myParentView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
myObjectAnimator.addListener(new ViewAnimator.AnimatorListener() { 
    public void onAnimationEnd(Animator animation) { 
    myParentView.setLayerType(View.LAYER_TYPE_NONE); 
    } 
    public void onAnimationRepeat(Animator animation) { 
    } 
    public void onAnimationStart(Animator animation) { 
    } 
    public void onAnimationCancel(Animator animation) { 
    myParentView.setLayerType(View.LAYER_TYPE_NONE, null); 
    } 
} 
myObjectAnimator.start(); 

In diesem Fall, wenn Sie mit der translateX Eigenschaft übersetzen myParentView sind, dann wird es in Lagen myParentView und Kinder alle in eine Ebene. Legen Sie es in Hardware-Speicher. Übersetzen Sie die gesamte Ansicht auf einmal. Entfernen Sie dann nach Abschluss myParentView aus dem Speicher.

EDIT:

Eine letzte Anmerkung, wreaks Alpha verheerend auf die CPU. Wenn Sie etwas auf Halb-Alpha haben und es über die Ansicht hinweg übersetzen, wird es schwieriger zu rendern als wenn Sie die Ansicht einfach übersetzen. Verwenden Sie es sparsam.

1

Vielleicht können Sie eine neue Ansicht (die nur den Animator enthält) auf Ihrer Originalansicht überlagern. Die neue Ansicht wurde auf Transparent festgelegt.

Das Zurücksetzen, das Sie tun sollten, ist ungültig die neue Ansicht ohne Ihre ursprüngliche Ansicht.

1

Nachdem Sie Ihre Fragen durchlaufen haben, werde ich vorschlagen, gehen Sie bitte durch diese standard document, die ordentlich ist, damit Sie verstehen, wie man invalidate() richtig verwendet. Zweitens gibt es verschiedene Möglichkeiten, die Android-API bereits bietet, um mit Animationen in verschiedenen Situationen zu arbeiten.

Here, ich hoffe, die meisten Ihrer Zweifel werden geklärt. Bitte gehen Sie durch die Unterabschnitte und verwandte Blog erwähnt ihre.

Hoffe, das wird Ihnen helfen.

Verwandte Themen