18

Sto utilizzando la nuova Lollipop api su setEnterTransition su un frammento e quindi aggiungo una transizione di elemento condiviso per un'immagine nel frammento. Il comportamento desiderato è il primo, l'immagine dovrebbe spostarsi nella sua posizione, dopodiché il resto delle viste nel frammento dovrebbe dissolversi.Immettere la transizione su un frammento con un elemento condiviso ha come target l'elemento condiviso

Tuttavia, enterTransition viene applicato all'elemento condiviso in modo che si stia dissolvendo con resto delle opinioni. Se non si imposta enterTransition, l'immagine si sposta correttamente ma mentre è in movimento, l'altro contenuto è già visibile.

Come posso evitare di applicare enterTransition alla vista condivisa?

Ho trovato this commit in the AOSP che sembra dovrebbe risolvere questo problema, ma non sembra funzionare.

Ecco il codice di esempio:

public class Fragment1 extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.main_fragment, container, false); 
    final ImageView imageView = (ImageView) rootView.findViewById(R.id.image); 
    final Button button = (Button) rootView.findViewById(R.id.button); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     TransitionSet transitionSet = new TransitionSet(); 
     transitionSet.addTransition(new ChangeImageTransform()); 
     transitionSet.addTransition(new ChangeBounds()); 
     transitionSet.setDuration(300); 

     Fragment fragment2 = new Fragment2(); 
     fragment2.setSharedElementEnterTransition(transitionSet); 
     fragment2.setSharedElementReturnTransition(transitionSet); 
     Fade fade = new Fade(); 
     fade.setStartDelay(300); 
     fragment2.setEnterTransition(fade); 

     getFragmentManager().beginTransaction() 
      .replace(R.id.container, fragment2) 
      .addSharedElement(imageView, "SharedImage") 
      .commit(); 
     } 
    }); 
    return rootView; 
    } 
} 

risposta

21

La transizione entrare non deve applicare le i punti di vista degli elementi condivisi. Lo scenario più probabile è che l'elemento condiviso si trovi all'interno di un'altra vista con uno sfondo, rendendo tale visualizzazione influenzata dalla transizione di invio. È una situazione come questa:

<FrameLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#FFF" 
    > 
    <ImageView android:src="@drawable/pretty_picture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:transitionName="picture" 
     android:padding="20dp"/> 
</FrameLayout> 

Qui, ImageView è l'elemento condiviso.

Se ciò accade, ti consigliamo di aggiungere una transizione magica: ChangeTransform. Se rileva che il genitore cambia, estrarrà l'elemento condiviso dal genitore e lo passerà separatamente.

+1

George, potrei baciarti! Questo risolve il mio problema con le mie viste che iniziavano sempre la loro animazione dalla parte superiore dello schermo nel 2 ° frammento invece di partire da dove erano posizionati nel 1 ° frammento. Ecco un link alla mia domanda (questo un sacco di commenti) grazie! http://stackoverflow.com/questions/26950801/shared-elements-animating-between-fragments – brockoli

+0

George, è così che inizialmente doveva essere usato "ChangeTransform"? O la sua specifica implementazione è appena capita di coprire questo caso? Sembra quasi arbitrario che usare 'ChangeTransform' possa risolvere magicamente le cose. C'è una ragione per cui 'ChangeBounds',' ChangeImageTransform', ecc. Non sono implementati anche per coprire questo caso? –

+0

Sì. Le transizioni in genere animano un piccolo insieme di proprietà in modo che le transizioni possano essere combinate come desiderato. Avevamo bisogno di gestire il caso in cui transizione genitore e figlio separatamente. Poiché ciò richiede che le stesse proprietà siano animate, abbiamo dovuto unire le Transizioni apparentemente differenti. –

Problemi correlati