2015-08-04 17 views
20

Nella mia app sto provando a utilizzare la condivisione di elementi introdotta di recente tra le attività. Tutto funziona come un incantesimo se l'elemento condiviso è in posizione fissa (ad esempio android:layout_gravity="top") ma il problema si presenta quando la vista è ancorata.La transizione dell'elemento condiviso Android tra due attività non funziona

La mia prima attività si presenta così:

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/tools" 
    xmlns:auto="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     ... 
    </android.support.design.widget.AppBarLayout> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/play_all" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|right" 
     android:layout_margin="24dp"/> 

</android.support.design.widget.CoordinatorLayout> 

mia seconda attività si presenta così

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:auto="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/play" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="16dp" 
     android:elevation="10dp" 
     android:src="@drawable/ic_action_play" 
     auto:layout_anchor="@+id/appbar" 
     android:transitionName="fab_button" 
     auto:layout_anchorGravity="bottom|right" /> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="192dp"> 
     ... 
    </android.support.design.widget.AppBarLayout> 

    ... 

</android.support.design.widget.CoordinatorLayout> 

Il codice che uso è il seguente:

Intent intent = ...; 
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, view, "fab_button"); 
startActivity(intent, options.toBundle()); 

Se uso il layout_anchor e layout_anchorGravity attributi la transizione tra i due FAB è fatta senza animazione. Se il secondo FAB è in posizione fissa, funziona perfettamente. Che cosa sto facendo di sbagliato?

+1

Penso che tu non stia facendo nulla di male. La mia app è molto simile alla tua per queste due attività e ho lo stesso problema. Penso che il framework di transizione degli elementi condivisi non possa ottenere la posizione dell'elemento ancorato ... Spero che qualcuno possa trovare una soluzione attraverso –

+0

Vedo che ci sono applicazioni in cui questo comportamento funziona bene.Immagino stiano facendo alcune logiche personalizzate per ottenere questo effetto. –

+0

Grazie per la segnalazione, mi sono grattato la testa per ore contro questo. Come ho rimosso l'app: layout_anchor la transizione è stata fluida come doveva essere. Com'è possibile che questa faccenda sia stata così difficile da scoprire e non sia stata ancora segnalata ... Dai ... – FrancescoC

risposta

1

Attività Elementi condivisi Transizioni:

Seguire i passaggi.

  1. Enable Window Content Transitions
  2. Assign a Common Transition Name
  3. Start Activity
  4. Multiple Shared Elements
  5. Customizing Shared Elements Transition

penso che non si dispone di seguire il secondo passo. Avevi dato android:transitionName="fab_button" in Secondo Activity ma non dato in Prima Activity.

XML di primo Activity (aggiunto android:transitionName="fab_button"):

<android.support.design.widget.FloatingActionButton 

     android:transitionName="fab_button" 

     android:id="@+id/play_all" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|right" 
     android:layout_margin="24dp"/> 

maggio sopra link vi aiuta.

+2

No, non è quello. La prima vista attività è una vista di immagini e la destinazione è un FAB ancorato. Se faccio la destinazione FAB non ancorata tutto funziona bene. – Andy

+0

@Andy hai salvato la mia giornata !!! Per favore, hai qualche idea del perché? –

0

Si dovrebbe avere anche il nome di transizione nell'attività di ricezione. Controlla il mio codice.

prima azione

<android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     android:src="@drawable/ic_register" 
     android:transitionName="@string/transition"/> 

</android.support.design.widget.CoordinatorLayout> 

e la seconda attività xml

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
android:transitionName="@string/transition" 
tools:context="com.example.shoppingappdemo.RegiserActivity"> 
+0

Lo stesso che ho dato nella mia risposta. –

+0

Ci scusiamo per il fatto che ... in realtà la mia rete era lenta, quindi dopo aver postato la mia risposta mostro urs ... mi dispiace per quello –

+0

Questo non è il problema. Si prega di leggere la domanda, tutto funziona bene se il FAB di destinazione non è ancorato. Il problema sembra essere quando il FAB di destinazione è ancorato. – Andy

12

Questo potrebbe essere un po 'tardi, ma ho trovato un modo per aggirare il problema. Devi avvolgere il tuo elemento condiviso in un layout e mettere l'ancora su quel layout:

<FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     auto:layout_anchor="@+id/appbar" 
     auto:layout_anchorGravity="bottom|right"> 

    <android.support.design.widget.FloatingActionButton 
      android:id="@+id/play" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="16dp" 
      android:elevation="10dp" 
      android:src="@drawable/ic_action_play" 
      android:transitionName="fab_button" /> 

<FrameLayout/> 
+1

Questo funziona! – Froyo

+1

È un bug in coordinatorLayout + transizioni condivise? Ma funziona come un fascino :) – Harshit

Problemi correlati