2015-09-10 3 views
7

Während Aktivitäten Transit eine andere, gemeinsame Elemente, die sich über dem Bildschirm in neue Aktivität, Overlay Navigationsleiste als shared elements overlay navigation barGemeinsame Elemente überlaufen Navigationsleiste im Übergangsanimation

Auch auf Bild zu sehen Sie diesen Fehler sehen in Video view overlay navigation bar

+1

Dieses Video ist privat. :): P –

+0

Ich denke, Sie kennen die Antwort vor dem Posten der Frage. –

+0

Vielen Dank für Ihre Nachricht. Ich habe den Zugriff auf das Video geändert. –

Antwort

0

ich fand, es ist Bug Android, wenn Sie

<item name="android:windowDrawsSystemBarBackgrounds">true</item> 

in der Aktivität des Themas verwenden.

Aber es muss Farbe zu Statusleiste setzen, also konnte ich es nicht auf false setzen. Andernfalls ist es möglich, diesen Flag in Runtime können Sie über

if (Build.VERSION.SDK_INT >= 21) { 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
} 

Auch setzt diesen Flag löschen über Window ‚s clearFlags Methode.

Dann lösche ich dieses Flag vor dem Start Transition Animation in der zweiten Aktivität und fügen Sie dieses Flag nach dem Übergang abgeschlossen. Es muss nur in angerufener Aktivität durchgeführt werden.

UPDATE

fand ich eine bessere Lösung. In Android werden alle freigegebenen Elementansichten oben auf der Dekoransicht angezeigt. Navigationsleiste Hintergrund lag in der Regel oben auf Dekor-Ansicht. Aber in der Übergangszeit liegen geteilte Elemente höher.

Es ist möglich, navigationBarBackground Ansicht fügt Elemente zu teilen, die von getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground) zugänglich ist. Dazu müssen Sie sie zu den gemeinsam genutzten Elementen in der aufrufenden Aktivität hinzufügen und sie den freigegebenen Elementen in der aufgerufenen Aktivität hinzufügen.

Es gibt ein Problem. Sie müssen warten, wenn die Navigationshintergrundansicht an die Dekoransicht angehängt wird. Dies ist beispielsweise, wie dieses Problem in onCreate() Methode löst in genannten Aktivität

ActivityCompat.postponeEnterTransition(this); 
final View decorView = getWindow().getDecorView(); 
decorView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     decorView.removeOnLayoutChangeListener(this); 
     View navigationBarBackground = getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground); 
     if (navigationBarBackground != null) { 
      android.support.v4.view.ViewCompat.setTransitionName(navigationBarBackground, "navigationBg"); 
     } 
     ActivityCompat.startPostponedEnterTransition(MyActivity.this); 
    } 
}); 
+2

Sie sollten 'Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME' und' Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME' als Übergangsnamen verwenden, während Sie benutzerdefinierte Hintergründe verwenden. – kuelye

0

Wenn Sie SharedElement Übergang verwenden Sie den Standard-Aktivität Übergang deaktivieren können, die durch den Aufruf ein Fade ist:

getWindow().setEnterTransition(null); 

Dies wird auch Lösen Sie das Problem, wenn sich das freigegebene Element hinter der Statusleiste befindet und beim Starten der Animation ein Fehler auftritt.

2

(1) Deaktivieren Sie die Überlagerung von
android:windowSharedElementsUseOverlay="false" in Ihrer XML-Einstellung. Wenn diese Option deaktiviert ist, werden die freigegebenen Elemente als Teil der Ansichtshierarchie der aufgerufenen Aktivität gezeichnet. Dies macht es unmöglich, dass sich die gemeinsamen Elemente versehentlich über den UI-Balken des Systems überlappen.
Leider kann die Deaktivierung dieses Verhaltens zu neuen Problemen führen ...
Zum Beispiel können Sie feststellen, dass nicht freigegebene Ansichten in beiden Aktivitäten beginnen, die geteilten Elemente zu trennen, wenn sie an ihren Platz gehen. In den meisten Fällen können Sie dies verhindern, indem Sie und "android:clipToPadding="false" für jedes übergeordnete Element in Ihrem XML-Element festlegen, obwohl je nach Anwendungsfall möglicherweise eine zusätzliche Konfiguration erforderlich ist.
(2) In die Aktionsleiste, Statusleiste Hintergrund und Hintergrund der Navigationsleiste als zusätzliche gemeinsame Elemente
die System Bars gemeinsame Elemente Indem können Sie, dass sowohl die ursprünglichen gemeinsamen Elemente und das System UI gewährleisten gezogen bei die gleiche Ebene über dem Rest der Ansichtshierarchie des Fensters. Um einen Verweis auf diesen Ansichten zu erhalten, können Sie den folgenden Code verwenden:

View decor = getWindow().getDecorView();
View statusBar = decor.findViewById(android.R.id.statusBarBackground);
View navBar = decor.findViewById(android.R.id.navigationBarBackground);
View actionBar = decor.findViewById(getResources().getIdentifier("action_bar_container", "id", "android"));

Sie können diese für weitere Diskussion siehe this post