9

Sto riscontrando uno strano problema/bug relativo alle transizioni ImageView tra Attività in Android 5.0.Problema strano durante la transizione di ImageView in Android 5.0

Sto cercando di passare una miniatura da Fragment A (in Activity A) per l'immagine di intestazione di Fragment B (in Activity B). Funziona bene la maggior parte del tempo, ma a volte incasina leggermente.

Ecco una foto di quello che sembra quando si scombina:

What a mess... :-)

Naturalmente, si suppone per riempire l'intera area. Entrambi ImageViews sono impostati su ScaleType.CENTER_CROP, quindi non riesco a immaginare che sia il problema.

Che cosa è curioso è che la questione si fissa immediatamente dopo lo scorrimento in Activity B (tutto è contenuto all'interno di una sottoclasse ScrollView che cambia il ImageView imbottitura su di scorrimento).

Il codice per il lancio Activity B è piuttosto semplice:

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
    activity, thumbImageView, "cover"); // "cover" is the shared element name for both ImageViews 
ActivityCompat.startActivity(activity, intent, options.toBundle()); 

Ecco il codice per la osservabile ScrollView ascoltatore:

scrollview.setOnScrollChangedListener(new OnScrollChangedListener() { 
    @Override 
    public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) { 
     // Such parallax, much wow 
     headerImageView.setPadding(0, (int) (t/1.5), 0, 0); 
    } 
}); 

Inoltre, qui è una parte del mio stile tema:

<item name="android:windowContentTransitions">true</item> 
<item name="android:windowAllowEnterTransitionOverlap">true</item> 
<item name="android:windowAllowReturnTransitionOverlap">true</item> 
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item> 
<item name="android:windowSharedElementExitTransition">@android:transition/move</item> 

Qualche idea?

+0

Quali transizioni utilizzate? – klmprt

+0

Mi dispiace, ho dimenticato di dirlo. È la transizione predefinita '@android: transition/move'. –

+0

Frequenza del bug (ad esempio ogni volta, a caso, ecc.). Inoltre, il problema si verifica ancora se si commenta il codice 'setPadding()' nel listener della vista scorrevole? Sto solo cercando di capire la causa principale del perché questo potrebbe accadere. –

risposta

4

Prova ad aggiungere il seguente codice per il metodo di Fragment di B onCreateView():

getActivity().postponeEnterTransition(); 
scrollView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    public boolean onPreDraw() { 
     scrollView.getViewTreeObserver().removeOnPreDrawListener(this); 
     getActivity().startPostponedEnterTransition(); 
     return true; 
    } 
}); 

Il problema si verifica ancora quando questo codice è presente? Questo assicurerà che la transizione inizi solo dopo il il frammento abbia completato il suo layout.

Si potrebbe anche essere necessario chiamare startPostponedEnterTransition() dopo tale ... per esempio, se si sta caricando un'immagine ad alta risoluzione nella vostra seconda attività, prova a chiamare startPostponedEnterTransition dopo che l'immagine è stata caricata (ad esempio impostare l'ascoltatore sul onPreDrawImageView anziché nella vista decor della finestra).

+0

Purtroppo, si verifica ancora. Sembra che la miniatura di ImageView venga trasferita senza modificare i limiti ai limiti più ampi di ImageView nell'attività B. –

+1

Potrebbe essere necessario chiamare postponeEnterTransition da onCreate() dell'attività. –

+0

Sono riuscito a capire il motivo esatto per questo. Sembra essere causato dal caricamento di un'immagine diversa (più alta risoluzione) nell'attività B.Ho usato la tua proposta, tranne che sto usando getActivity(). StartPostponedEnterTransition() dopo che l'immagine con risoluzione più alta è stata caricata. Non ottimale, perché è un po 'più lento, ma funziona! –

Problemi correlati