2015-09-09 27 views
6

Provando nuova libreria di progettazione Android ho trovato un bug con barra degli strumenti shadow. Quando si utilizza CollapsingToolbarLayout l'ombra sotto la barra degli strumenti appare solo quando la barra degli strumenti è compressa. Quando lo espandiamo, l'ombra scompare. Il mio layout assomigliaandroid design libreria toolbar shadow

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

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:fitsSystemWindows="true" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     app:contentScrim="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/user_avatar_height" 
      android:fitsSystemWindows="true" 
      android:scaleType="centerCrop" 
      app:layout_collapseMode="parallax" /> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:gravity="center_vertical" 
      app:layout_collapseMode="pin" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

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

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:background="@color/colorPrimary" 
     android:minHeight="?attr/actionBarSize" 
     app:tabGravity="fill" 
     app:tabIndicatorColor="@android:color/white" 
     app:tabMaxWidth="0dp" 
     app:tabMode="fixed" /> 

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

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

e risultati enter image description here C'è un'ombra quando barra degli strumenti è crollato.

enter image description here

Ma quando espanderlo shadow scomparire.

Esiste qualche soluzione per risolvere questo problema? Può esserci un modo per gestire l'aspetto/la scomparsa dell'ombra? Grazie.

+0

Potrebbe non essere un bug - è possibile è destinata ad essere facendo il comportamento di misura descritto in "spazio flessibile con sovrapposizione di contenuti" in fondo a questa pagina: https://www.google.com/design /spec/patterns/scrolling-techniques.html#scrolling-techniques-scrolling – JoeyJubb

+0

Hai trovato qualche soluzione? Penso che il comportamento sia inteso, ma sembra una grande seccatura se vuoi l'ombra anche se espansa. Ho provato ad ascoltare AppBarLayout modifiche all'offset e a impostare l'ombra manualmente, e anche a racchiudere l'AppBarLayout in RelativeLayout e manualmente a mettere un'ombra in basso, ma nulla funziona come voglio ... – Thoast83

+0

@ Thoast83 Posta una risposta qui sotto. –

risposta

0

ho solo l'override CollapsingToolbarLayout codice come questo

public class ShadowCollapsingToolbarLayout extends CollapsingToolbarLayout { 

private AppBarLayout.OnOffsetChangedListener mOnOffsetChangedListener; 

//constructors 

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    ViewParent parent = this.getParent(); 
    if (parent instanceof AppBarLayout) { 
     if (mOnOffsetChangedListener != null) 
      ((AppBarLayout) parent).addOnOffsetChangedListener(mOnOffsetChangedListener); 
    } 
} 

public void setOnOffsetChangeListener(AppBarLayout.OnOffsetChangedListener listener) { 
    mOnOffsetChangedListener = listener; 
} 
} 

usarlo in XML anziché nativa CollapsingToolbarLayout e impostare ascoltatore come questo

mCollapsingLayout.setOnOffsetChangeListener(new AppBarLayout.OnOffsetChangedListener() { 
      @Override 
      public void onOffsetChanged(AppBarLayout appBarLayout, int i) { 
       ViewCompat.setElevation(appBarLayout, appBarLayout.getTargetElevation()); 
      } 
     }); 
3

Aggiornamento

sembra che il supporto il team di biblioteche di Google ha introdotto il comportamento come parte di 24.0.0, ma era un po 'buggato ora c'è un nuovo workaround che devi fare.

1 - Creare appbar_always_elevated.xml nella cartella animator-v21 nella directory res.

<?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> 

2 - In AppBarLayout utilizzano:

<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> 

Vecchio risposta

Hanno risolto questo come parte della versione nuova libreria di supporto (24) in modo che solo bisogno di aggiornare e utilizzare la proprietà corretta.

orologio https://youtu.be/w45y_w4skKs?t=31m52s

enter image description here


Vecchio risposta

Ho risolto questo problema con un FrameLayout intorno al ViewPager e l'impostazione android:foreground.

In allegato è la drawable che sto usando, e qui è il link al gist

enter image description here

1

La risposta di @ Amilcar-andrade mi ha aiutato a trovare la soluzione giusta in quanto il suo link non è corretto .

si deve applicare il stateListAnimator al AppBarLayout:

esempio:

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="320dp" 
    android:stateListAnimator="@animator/appbar_always_elevated" 
    android:fitsSystemWindows="true"> 

e utilizzare questo XML come animatore:

<?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> 
0

Nel mio caso, questo codice ha funzionato per me !

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:stateListAnimator="@null" 
    android:elevation="4dp">