174

我正在使用支持库 v21 中的新工具栏更新我的应用程序。我的问题是,如果我不设置“海拔”属性,工具栏不会投射任何阴影。这是正常行为还是我做错了什么?

我的代码是:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical">

   <android.support.v7.widget.Toolbar
       xmlns:app="http://schemas.android.com/apk/res-auto"
       android:id="@+id/my_awesome_toolbar"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:background="?attr/colorPrimary"
       android:elevation="4dp"
       android:minHeight="?attr/actionBarSize"
       app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

   <FrameLayout
       android:id="@+id/FrameLayout1"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       .
       .
       .

在我的 Activity - OnCreate 方法中:

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);
4

20 回答 20

261

我最终为工具栏设置了自己的阴影,认为它可能对任何寻找它的人有所帮助:

<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:layout_gravity="top"
              android:orientation="vertical">

    <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
                                       android:layout_width="match_parent"
                                       android:layout_height="wrap_content"
                                       android:background="@color/color_alizarin"
                                       android:titleTextAppearance="@color/White"
                                       app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

    <FrameLayout android:layout_width="match_parent"
                 android:layout_height="match_parent">

        <!-- **** Place Your Content Here **** -->

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

    </FrameLayout>

</LinearLayout>

@drawable/toolbar_dropshadow:

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

    <gradient android:startColor="@android:color/transparent"
              android:endColor="#88333333"
              android:angle="90"/>

</shape>

@color/color_alizarin

<color name="color_alizarin">#e74c3c</color>

在此处输入图像描述

于 2014-11-13T08:11:56.247 回答
220

谷歌几周前发布了设计支持库,这个库中有一个很好的解决方案。

将设计支持库作为依赖项添加到build.gradle

compile 'com.android.support:design:22.2.0'

添加AppBarLayout库提供的作为布局周围的包装器Toolbar以生成投影。

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

这是结果:

在此处输入图像描述

设计支持库还有很多其他技巧。

  1. http://inthecheesefactory.com/blog/android-design-support-library-codelab/en
  2. http://android-developers.blogspot.in/2015/05/android-design-support-library.html

安卓X

如上所述,但具有依赖性:

implementation 'com.google.android.material:material:1.0.0'

com.google.android.material.appbar.AppBarLayout

于 2015-06-24T12:18:41.080 回答
26

在 API 21 (Android Lollipop) 之前,您不能使用海拔属性。但是,您可以通过编程方式添加阴影,例如使用放置在工具栏下方的自定义视图。

@布局/工具栏

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/blue"
    android:minHeight="?attr/actionBarSize"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

<View
    android:id="@+id/toolbar_shadow"
    android:layout_width="match_parent"
    android:layout_height="3dp"
    android:background="@drawable/toolbar_dropshadow" />

@drawable/toolbar_dropshadow

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <gradient
        android:startColor="@android:color/transparent"
        android:endColor="#88333333"
        android:angle="90"/> </shape>

在您的活动布局中 <include layout="@layout/toolbar" />

在此处输入图像描述

于 2015-04-09T07:11:00.807 回答
19

使用/values文件夹根据操作系统版本应用正确的阴影样式。

对于 5.0 以下的设备,使用/values/styles.xmlwindowContentOverlay添加到您的活动主体:

<style name="MyViewArea">
    <item name="android:foreground">?android:windowContentOverlay</item>
</style>

<style name="MyToolbar">
    <item name="android:background">?attr/colorPrimary</item>
</style>

然后通过更改主题添加您自己的自定义阴影以包括:

<item name="android:windowContentOverlay">@drawable/bottom_shadow</item>

您可以在此处获取 Google 的 IO 应用影子资源:https ://github.com/google/iosched/blob/master/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png

对于 5.0 设备及更高版本,使用/values-v21/styles.xml使用自定义标题样式将高度添加到您的工具栏:

<style name="MyViewArea">
</style>

<style name="MyToolbar">
    <item name="android:background">?attr/colorPrimary</item>
    <item name="android:elevation">4dp</item>
</style>

请注意,在第二种情况下,我必须创建一个空的MyViewArea样式,这样windowContentOverlay也不会出现。

[更新:更改了资源名称并添加了 Google 影子。]

于 2015-04-02T23:29:51.017 回答
14

这对我很有用:

<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>
于 2015-03-11T10:19:08.363 回答
13

如果您设置ToolBarasActionBar然后只需调用:

getSupportActionBar().setElevation(YOUR_ELEVATION);

注意:这必须在之后调用setSupportActionBar(toolbar);

于 2014-12-07T08:56:39.713 回答
8

我加了

<android.support.v7.widget.Toolbar
...
android:translationZ="5dp"/>

在工具栏描述中,它对我有用。使用 5.0+

于 2018-10-29T16:24:59.460 回答
7

我的问题是,如果我不设置“海拔”属性,工具栏不会投射任何阴影。这是正常行为还是我做错了什么?

这是正常的行为。另请参阅本文末尾的常见问题解答。

于 2014-10-26T16:51:20.977 回答
7

玩了几个小时,这对我有用。

从和小部件中删除所有elevation属性(包括如果您正在应用任何样式)。appBarLayoutToolbarstyles.xml

现在在活动中,将其应用elvation到您的actionBar

Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setElevation(3.0f);

这应该有效。

于 2017-03-26T07:38:40.583 回答
6

您所需要的只是一个android:margin_bottom等于该值的android:elevation值。不需要AppBarLayout,clipToPadding等。

例子:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_marginBottom="4dp"
    android:background="@android:color/white"
    android:elevation="4dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!--Inner layout goes here-->

    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.appcompat.widget.Toolbar>
于 2019-02-07T13:37:58.883 回答
4

您还可以使其与RelativeLayout. 这会稍微减少布局嵌套;)

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbar" />

    <View
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:layout_below="@id/toolbar"
        android:background="@drawable/toolbar_shadow" />
</RelativeLayout>
于 2015-05-11T15:11:16.990 回答
2

在我的情况下,提升效果不佳,因为我没有为工具栏提供任何背景。尝试为工具栏提供背景颜色,然后设置高度,它会很好地工作。

于 2021-01-08T07:22:47.017 回答
1

正确的答案是使用android:background="@android:color/white"
android:backgroundTint="#ff00ff" 添加到工具栏

如果您使用其他颜色然后白色作为背景,它将消除阴影。好一个谷歌!

于 2019-06-17T13:35:50.713 回答
1

大多数解决方案在这里都可以正常工作。想展示另一个类似的替代方案:

毕业典礼:

implementation 'androidx.appcompat:appcompat:1.0.0-rc02'
implementation 'com.google.android.material:material:1.0.0-rc02'
implementation 'androidx.core:core-ktx:1.0.0-rc02'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

您的布局可以有一个工具栏视图和一个阴影,如下所示(当然需要修改):

<LinearLayout
    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:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:titleTextAppearance="@style/Base.TextAppearance.Widget.AppCompat.Toolbar.Title"/>

    <include
        layout="@layout/toolbar_action_bar_shadow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

res/drawable-v21/toolbar_action_bar_shadow.xml

<androidx.appcompat.widget.AppCompatImageView
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content" android:src="@drawable/msl__action_bar_shadow"/>

res/drawable/toolbar_action_bar_shadow.xml

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:foreground="?android:windowContentOverlay" tools:ignore="UnusedAttribute"/>

res/drawable/msl__action_bar_shadow.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape
            android:dither="true"
            android:shape="rectangle" >
            <gradient
                android:angle="270"
                android:endColor="#00000000"
                android:startColor="#33000000" />

            <size android:height="10dp" />
        </shape>
    </item>

</layer-list>

样式.xml

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar as Toolbar)
    }
}

完整示例在这里,因为我注意到 IDE 有一个错误,即foreground属性太新,无法在此处使用。

于 2018-09-17T12:00:25.437 回答
0

您需要同时使用背景颜色和高度

<com.google.android.material.appbar.MaterialToolbar
     app:elevation="8dp"
     android:elevation="8dp"
     android:background="@color/white"/>
于 2021-09-24T12:26:34.570 回答
0

actionbar_background.xml

    <item>
        <shape>
            <solid android:color="@color/black" />
            <corners android:radius="2dp" />
            <gradient
                android:startColor="@color/black"
                android:centerColor="@color/black"
                android:endColor="@color/white"
                android:angle="270" />
        </shape>
    </item>

    <item android:bottom="3dp" >
        <shape>

            <solid android:color="#ffffff" />
            <corners android:radius="1dp" />
        </shape>
    </item>
</layer-list>

添加到 actionbar_style 背景

<style name="Theme.ActionBar" parent="style/Widget.AppCompat.Light.ActionBar.Solid">
    <item name="background">@drawable/actionbar_background</item>
    <item name="android:elevation">0dp</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:layout_marginBottom">5dp</item>

name="displayOptions">useLogo|showHome|showTitle|showCustom

添加到基本主题

<style name="BaseTheme" parent="Theme.AppCompat.Light">
   <item name="android:homeAsUpIndicator">@drawable/home_back</item>
   <item name="actionBarStyle">@style/Theme.ActionBar</item>
</style>
于 2017-06-20T14:25:55.933 回答
0

我发布这个是因为我花了几个小时才找到所以我希望它可以帮助别人。

尽管我创建了一个简单的活动并按如下方式放置了工具栏,但我遇到了阴影/高度没有显示的问题:

 <androidx.appcompat.widget.Toolbar
        android:id="@+id/mt_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_collapseMode="pin"
        android:background="@color/colorPrimaryDark"
        android:elevation="12dp"/>

事实证明,在清单设置android:hardwareAccelerated="false"中造成了它!一旦我删除它,阴影就出现了

于 2020-10-28T21:53:37.877 回答
0
Just put  background
 <androidx.appcompat.widget.Toolbar
                android:layout_width="match_parent"
                android:elevation="8dp"
                android:background="#fff"

                android:layout_height="?android:attr/actionBarSize"></androidx.appcompat.widget.Toolbar>
于 2021-09-06T04:56:38.717 回答
0

我对阴影有类似的问题。在我的例子中,阴影是由 AppBarLayout 的直接父级绘制的。如果父级的高度与 AppBarLayout 的高度相同,则无法绘制阴影。所以检查父布局的大小,也许重新制作布局可以解决这个问题。https://www.reddit.com/r/androiddev/comments/6xddb0/having_a_toolbar_as_a_fragment_the_shadow/

于 2018-01-23T09:37:17.507 回答
0

对于 5.0 + :您可以将 AppBarLayout 与工具栏一起使用。AppBarLayout 具有“海拔”属性。

 <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:elevation="4dp"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <include layout="@layout/toolbar" />
    </android.support.design.widget.AppBarLayout>
于 2017-08-28T13:01:30.390 回答