web-dev-qa-db-fra.com

Élévation CoordinatorLayout et AppBarLayout

J'ai créé une disposition AppBar comme celle-ci

<Android.support.design.widget.AppBarLayout
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/appbar_layout"
    Android:layout_height="@dimen/app_bar_height"
    Android:layout_width="match_parent"
    Android:fitsSystemWindows="true"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:elevation="20dp">

    <Android.support.design.widget.CollapsingToolbarLayout...>
</Android.support.design.widget.AppBarLayout>

cela fonctionne et projette une ombre dans le LinearLayout:

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <include layout="@layout/app_bar_large" />
</LinearLayout>

Cependant quand je l'ai mis dans l'ombre de CoordinatorLayout a disparu:

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

    <include layout="@layout/app_bar_large" />
</Android.support.design.widget.CoordinatorLayout>

Comment puis-je faire appbar pour afficher à nouveau son ombre?

enter image description here

21
Kata Lune

Il s'agit en fait d'un détail d'implémentation de CollapsingToolbarLayout, comme vu dans le code source :

if (Math.abs(verticalOffset) == scrollRange) {
  // If we have some pinned children, and we're offset to only show those views,
  // we want to be elevate
  ViewCompat.setElevation(layout, layout.getTargetElevation());
} else {
  // Otherwise, we're inline with the content
  ViewCompat.setElevation(layout, 0f);
}

Ce qui supprime l'élévation lorsque le CollapsingToolbarLayout affiche des éléments non épinglés - par défaut, il n'a d'élévation que lorsque seuls les enfants épinglés sont visibles.

15
ianhanniballake

la raison est ci-dessus, essayez ceci pour résoudre:

appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            //some other code here
            ViewCompat.setElevation(appBarLayout, The Elevation In Px);
        }
    });
6
halfCup