2016-06-22 7 views
8

In AppCompat v24.0.0 Ursachen Rendering von Schatten/Höhe-AppbarLayout nach Aktivität sichtbar ist. Und eine Verzögerung kann in der Schattenzeichnung zu AppbarLayout leicht gesehen werden.AppBarLayout Höhenänderung auf AppCompat verzögert v24.0.0

Und diese Verzögerung war nicht in der vorherigen Version der AppCompat-Bibliothek.

Getestet sowohl mit AppCompat v24.0.0 und AppCompat v23.4.0, Schatten Zeichnung deutlich in der neuen Version zu sehen.

+0

Und was ist Ihre Frage für die Stackoverflow-Community? Vielleicht sollten Sie einen Fehlerbericht für das appcompat-Team einreichen. – Budius

Antwort

18

Dies ist ein Fehler in Appcompat v24.0.0.

Referenzen: https://code.google.com/p/android/issues/detail?id=213895

Um die Verzögerung in elevation Zeichnung zu minimieren, stellen Sie die Dauer auf 1ms in Ihrem eigenen StateListAnimator und es AppbarLayout anzuwenden.

appbar_always_elevated.xml in Animator-v21 Ordner unter res Verzeichnis.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item> 
     <objectAnimator android:propertyName="elevation" 
         android:valueTo="8dp" 
         android:valueType="floatType" 
         android:duration="1"/> 
    </item> 

</selector> 

In AppbarLayout:

<android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="300dp" 
     android:fitsSystemWindows="true" 
     android:stateListAnimator="@animator/appbar_always_elevated" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

</android.support.design.widget.AppBarLayout> 
+0

@JoaoSousa Antwort mit Ihrem Vorschlag aktualisiert. Ich habe auch den gleichen Fehler beim Platzieren des Zustandslistenanimators, also habe ich in "animator-v21" platziert und das hat wie ein Zauber funktioniert, der diesen Fehler beseitigt. –

+0

@Vipul Asri Also, wenn der richtige Ordner zum Platzieren des Zustandslistenanimators "anim-v21" ist, warum zeigt es einen Fehler an? Wo soll ich es hinstellen? –

+0

@ItielMaimon Wenn der Fehler angezeigt wird, funktioniert es auch während der Laufzeit einwandfrei. Aber wenn Sie diesen Fehler entfernen möchten, refafieren Sie einfach Ihre "anim-v21" zu "animator-v21". Als Selektor-Tag ist in 'anim-v21' ab sofort nicht erkennbar. –

10

Chris Banes sagte here:

Die StateListAnimator alle Handling jetzt Erhebung besitzt. Wenn Sie es selbst tun möchten, setzen Sie einen Null StateListAnimator und rufen Sie setElevation() auf, wie Sie möchten.

Also, wenn Ihr AppBarLayout ist nicht zusammenklappbar können Sie verwenden:

<android.support.design.widget.AppBarLayout 
    android:stateListAnimator="@null" 
    android:elevation="@dimen/design_appbar_elevation"> 
+0

Dies sollte die akzeptierte Antwort sein. Dadurch verhält sich Design 24.0.0 wie seine ältere Version. –

+0

@ MarcelWesołowski Nur wenn Sie CollapsibleToolbarLayout nicht verwenden. –

+0

@EugenPechanec Ich benutze 'CollapsibleToolbarLayout' und es funktioniert gut. Dies sollte als Antwort akzeptiert werden. – Sandak

0

@Vipul Asri uns eine gute Antwort gegeben, aber die appbar_always_elevated.xml in animator- sein sollte v11 statt animator-v21 Ordner. Das Layout, das die AppbarLayout hat, sollte das in einem v21-Ordner sein.

Zusammenfassend ist die Struktur wie folgt aus:

-res 
    -animator-v11 
     -appbar_always_elevated.xml 
    -layout 
     -a_layout_wich_has_the_appbarlayout.xml 
    -layout-v21 
     -a_layout_wich_has_the_appbarlayout.xml 

Hinweis, dass es zwei a_layout_wich_has_the_appbarlayout.xml Dateien (AppbarLayout in v21 Ordner mit Android: stateListAnimator Eigenschaft und in einem nicht v21 Ordner ohne diese Eigenschaft).

Werfen Sie einen Blick:

In einem nicht v21 Layout-Ordner:

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

Und in v21 Layout-Ordner:

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:stateListAnimator="@animator/appbar_always_elevated"> 

EDIT

Wenn Sie die AppbarLayout mit einem TabLayout verwenden, wird der Schatten sofort gezeichnet, aber beachten Sie, dass wenn Sie mit der Eigenschaft android: stateListAnimator diesen Fall verwenden, die Schattenansicht ein bisschen anders ist.

7

Ich denke, es ist kein Fehler, eine Funktion.

AppBarLayouts Höhenanimationsdauer wird von R.integer.app_bar_elevation_anim_duration gesteuert, die standardmäßig 150 ist.

die Animation zu entfernen, gehen Sie einfach die folgenden und das ist es:

<integer name="app_bar_elevation_anim_duration" tools:override="true">0</integer>

+0

Zustimmen, wenn es ein Fehler ist, sollten sie dies beheben, wenn eine neuere Version von appcompat lib release, Ich verwende 25.1.1 und immer noch das langsame Problem. lol – BennyKok

+0

Dies sollte definitiv als richtige Antwort akzeptiert werden – daxh

Verwandte Themen