Infatti, bringToFront()
non aiuta; cambia semplicemente l'ordine dei bambini nella matrice figli dei suoi genitori, ma non cambia l'ordine in cui i bambini sono resi.
Se si utilizza API-21 o superiore, è possibile modificare il valore Z
della vista (view.setZ(..)
) per portarlo in primo piano.
Sotto API-21 è disponibile una richiamata che è possibile utilizzare: RecyclerView.ChildDrawingOrderCallback
. Con esso puoi definire l'ordine in cui i bambini devono essere sottoposti a rendering. Puoi anche utilizzarlo con API-21 + nel caso non ti piaccia l'ombra extra che ottieni cambiando il valore Z
.)
Esempio:
final int indexOfFrontChild = rv.indexOfChild(desiredFrontView);
rv.setChildDrawingOrderCallback(new RecyclerView.ChildDrawingOrderCallback() {
private int nextChildIndexToRender;
@Override
public int onGetChildDrawingOrder(int childCount, int iteration) {
if (iteration == childCount - 1) {
// in the last iteration return the index of the child
// we want to bring to front (and reset nextChildIndexToRender)
nextChildIndexToRender = 0;
return indexOfFrontChild;
} else {
if (nextChildIndexToRender == indexOfFrontChild) {
// skip this index; we will render it during last iteration
nextChildIndexToRender++;
}
return nextChildIndexToRender++;
}
}
});
rv.invalidate();
in sostanza, onGetChildDrawingOrder(...)
si chiamerà childCount
volte e in ogni iteration
possiamo specificare quale bambino da rendere (restituendo il suo indice).
fonte
2015-06-04 13:33:36
Grazie, ma un costume LayoutManager può sollevare una certa complessità, sono riuscito a fare qualche trucco per clonare la vista che voglio animare. – Juude