Appcompat v21 barre d'outils elevation pre-lollipop

tout d'abord, je sais que cette question a déjà été posée, mais elle n'a pas encore reçu de réponse. J'espère que quelqu'un peut me donner une réponse.

dans mon application, j'utilise la barre D'outils de Appcompat_v7 (API 21). C'est mon code:

<android.support.v7.widget.Toolbar
    style="@style/DarkActionbarStyle"
    android:id="@+id/toolBar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/actionbar_height" />

et c'est le style de barre d'outils que j'utilise:

<style name="DarkActionbarStyle" parent="@style/Widget.AppCompat.Toolbar">
    <item name="android:background">?attr/colorPrimary</item>
    <item name="titleTextAppearance">@style/ActionBarTitle</item>
    <item name="android:elevation">2dp</item>
    <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
    <item name="theme">@style/ThemeActionBarDark</item>
</style>

<style name="ThemeActionBarDark" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="actionBarItemBackground">@drawable/btn_dark_orange</item>
    <item name="selectableItemBackground">@drawable/btn_dark_orange</item>
</style>

le problème est que l'élévation ne fonctionne pas avant la sucette. ainsi ma question Est: est - il possible d'avoir un l'ombre sous la Barre d'outils de pré-sucette appareils?

43
demandé sur Tristan Vanderaerden 2014-11-04 22:24:01

10 réponses

cela a très bien fonctionné pour moi:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/primary"
    card_view:cardElevation="4dp"
    card_view:cardCornerRadius="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/primary"
        android:minHeight="?attr/actionBarSize" />

</android.support.v7.widget.CardView>
75
répondu Islam A. Hassan 2015-03-11 10:15:09

utiliser le conteneur CardView pour barre d'outils est une mauvaise idée.

CardView est lourd, surtout pour les appareils bas de gamme.

la meilleure façon est de mettre une vue d'ombre de gradient sous la barre d'outils. Shadow view doit être un enfant direct de la disposition du coordonnateur. IE. L'appbar qui contient toolbar et shadow View doit être frère et sœur.

ajoutez ce composant de vue à votre mise en page.

 <View
    android:id="@+id/gradientShadow"
    android:layout_width="match_parent"
    android:layout_height="5dp"
    android:background="@drawable/toolbar_shadow"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    app:layout_collapseMode="pin"/>

Le drawable toolbar_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
<gradient
    android:angle="90"
    android:endColor="#33333333"
    android:startColor="@android:color/transparent"/>
</shape>

cela résoudra les problèmes dans les dispositifs pré-lollipop. Mais nous ne voulons pas de cette ombre dans les appareils lollipop et ci-dessus donc faire la visibilité pour aller dans les appareils avec lollipop et ci-dessus.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        findViewById(R.id.gradientShadow).setVisibility(View.GONE);
    }

fait.

15
répondu shijin 2016-06-02 06:36:18

vous pouvez ajouter l'ombre (élévation) en arrière en utilisant un FrameLayout avec foreground="?android:windowContentOverlay" . L'attribut elevation n'est pas supporté pré-Lollipop. Donc, si vous utilisez FrameLayout comme conteneur fragment juste ajouter l'attribut de premier plan à elle.

12
répondu Sniper 2015-05-03 10:34:08

comme j'ai eu des problèmes avec la méthode CardView widget, j'ai utilisé la méthode FrameLayout comme mentionné par @Sniper; elle fonctionne parfaitement!

je voulais juste partager le code que vous devrez utiliser. Mettez ceci directement sous la barre d'outils où votre contenu principal commence:

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:foreground="?android:windowContentOverlay">

Et ne pas oublier de fermer avec:

</FrameLayout>
7
répondu MegaCookie 2015-04-24 18:53:31

Il est possible d'avoir de vraies ombres animées et générées. La méthode utilisée par Lollipop est disponible depuis Froyo. L'accélération matérielle utilisée pour la génération d'ombres est disponible depuis Honeycomb je suppose. Voici comment ça marche:

  • dessinez votre vue sur un bitmap off-screen avec LightingColorFilter réglé à 0,0
  • floue la forme noire (le bitmap hors-écran) en utilisant la classe ScriptIntrinsicBlur et la valeur d'élévation en rayon
  • dessinez le bitmap sous la vue

il faut ajouter des attributs d'élévation personnalisés, des vues personnalisées capables de rendre les ombres, et utiliser le script de rendu et la bibliothèque de compatibilité (pour les appareils plus anciens). Je ne vais pas entrer dans les détails, car il y en a beaucoup, y compris des problèmes de compilation et des optimisations mineures des performances. Mais c'est possible.

Pourquoi il n'y a pas d'ombres dans le soutien officiel bibliothèque?

  • il faudrait des changements dans le cadre de L'UI car il est impossible de tirer librement hors limites de vue
  • l'animation douce nécessite un très bon GPU

voir:

6
répondu Zielony 2015-02-07 10:13:47

j'utilise ce réponse :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/orange"
    android:titleTextAppearance="@color/White"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

    <View
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:background="@drawable/toolbar_shadow" />
</LinearLayout>

toolbar_shadow.xml :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:startColor="#3f3f3f"
        android:endColor="@android:color/transparent"
        android:angle="270" />
</shape>
5
répondu Leebeedev 2017-05-23 12:18:10

You can't utilisez l'attribut elevation avant API 21 (Android Lollipop). Vous peut cependant ajouter l'ombre programmatique, par exemple en utilisant une vue personnalisée placée sous le Toolbar .

par exemple:

<ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar"
        android:background="@drawable/shadow"/>

où l'ombre est un dessin avec un dégradé noir.

4
répondu Alessandro Roaro 2014-11-04 21:30:54

pour afficher l'ombre sous votre barre d'outils s'il vous plaît utiliser AppBarLayout disponible dans Google Android Design Support Library. Voici un exemple de la façon dont il doit être utilisé.

<android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
   <android.support.v7.widget.Toolbar
            android:layout_height="?attr/actionBarSize"
            android:layout_width="match_parent"/>
     </android.support.design.widget.AppBarLayout>

pour utiliser Google Android bibliothèque de soutien de conception entrer en ligne de compte dans votre construire.gradle fichier:

 compile 'com.android.support:design:22.2.0'
2
répondu Michal 2015-09-28 08:57:51

la solution avec une vue pour ajouter une ombre manuellement fonctionnerait aussi longtemps qu'il n'y a pas de menus de barre d'action. Si c'est le cas, la vue de l'ombre s'arrêterait avant les icônes de la barre d'action.

je pense qu'il est plus facile d'avoir une disposition linéaire verticale avec appbar sur le dessus et une vue pour l'ombre au-dessous de lui comme prochain élément de disposition linéaire ou dans mon cas, il est

<LinearLayout Vertical> 
  <v7 toolbar/>
  <RelativeLayout>
     <View for shadow with alignParent_top= true/>
      ....
  </RelativeLayout>
</LinearLayout>

j'espère vraiment que la prochaine appCompat corrigera cela.

1
répondu onusopus 2015-06-11 17:52:05

une autre option est la bibliothèque suivante qui fournit 9patch shadows like the iosched app, android-materialshadowninepatch

0
répondu Osiloke 2015-04-19 20:22:18