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.
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. –
Nein, habe noch nichts geschrieben, nur versucht, alle Informationen zu bekommen, bevor ich es tue. :) – cottonBallPaws
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 :) –