Con l'uso degli Animatori di oggetti di proprietà, in pratica sono solo funzioni matematiche che ripetutamente chiamano un metodo "setN()" ogni X millisecondi dove "N" è la proprietà che si desidera modificare.
Nell'esempio fornito nel caso di alpha, entrambi richiederebbero una chiamata a invalidate()
per ridisegnare la vista che si sta animando. La differenza è che quando chiami setAlpha()
sull'oggetto View
, chiama per te invalidate()
. Se si dovesse impostare l'oggetto target sull'oggetto Paint
utilizzato per disegnare il drawable, sarà comunque necessario chiamare invalidate()
sullo View
in modo che venga ridisegnato con i nuovi parametri Paint
.
Idealmente si desidera impostare il target sul bambino di livello più alto che è possibile in modo che il ridisegno avvenga solo sulle viste che si desidera animare. Se si imposta la destinazione sulla vista radice, ad esempio, chiamerà invalidate()
su ogni bambino nell'intero ViewGroup che a sua volta chiamerà draw()
su ogni figlio nel ViewGroup. Se lo si imposta su un livello superiore ImageView
, verrà ridisposto solo lo ImageView
.
Per utilizzare al meglio l'hardware, è necessario utilizzare le proprietà del livello. Per prima cosa, devi decidere quale sarà la Vista genitore più in alto che vuoi animare. Se si desidera solo dissolvere lo Drawable
, sarà il Drawable
o contenente View
. Se vuoi sbiadire tutto, allora sarà la vista radice. Qualsiasi cosa tu decida di animare verrà applicata allo View
nel suo insieme in una volta.
Utilizzare setLayerType()
nella visualizzazione padre appena prima di avviare Animator. Impostalo su View#LAYER_TYPE_HARDWARE
. Quindi imposta AnimationListener
e ripristina il LayerType su View#LAYER_TYPE_SOFTWARE
o View#LAYER_TYPE_NONE
al completamento dell'animatore.
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 questo caso, se si dovesse tradurre myParentView
utilizzando la proprietà translateX
, allora metterà strato myParentView
e tutti i suoi figli in un unico piano. Inseriscilo nella memoria dell'hardware. Traduci l'intera vista tutto in una volta. Quindi, al termine, rimuovere myParentView
dalla memoria.
EDIT:
Una nota finale, Alpha seminano il terrore sulla CPU. Se hai qualcosa su half-alpha e lo traduci nella vista, sarà più difficile da renderizzare rispetto alla semplice conversione della vista. Usalo con parsimonia.
Bene, penso che lo stiate chiedendo perché causa problemi. L'animazione probabilmente sta invalidando tutto ma potremmo trovare una soluzione alternativa se ci mostri la gerarchia della vista che hai. Si prega di specificare cosa si sta animando in esso. –
No, non ho ancora scritto nulla, sto solo cercando di ottenere tutte le informazioni prima di me. :) – cottonBallPaws
Beh, se l'animazione funziona bene su dispositivi medi, allora siamo a posto. Tuttavia, se è notevolmente pesante, anche dopo i soliti miglioramenti come l'accelerazione hardware (che potrebbe non essere sempre disponibile), si dovrebbe trovare la propria soluzione. Ad esempio, se si sta animando uno sfondo che causa l'invalidazione dell'intera gerarchia, si crea uno snapshot della gerarchia e si anima lo sfondo dietro di esso. In ogni caso, è essenzialmente la tua decisione se mettere lo sforzo in quanto probabilmente funzionerà con l'accelerazione hardware e sulla maggior parte dei dispositivi. (fiduciosamente :) –