这是一个简单的问题:
我使用新的支持库,它允许我拥有一个 Toolbar 实例,甚至将其设置为活动的 actionBar(或使用默认的)。
如何自定义工具栏(或默认操作栏)投射的阴影?
我尝试使用“setElevation”(在他们两个上),但它似乎在 Android Lollipop 上没有做任何事情。
另外,我找不到如何自定义棒棒糖前版本的阴影。可能有一个API吗?或者至少是一个drawable(我没有找到,即使我试过了)?
好的,我设法找到了接下来的事情:
对于 Lollipop 和 pre-Lollipop,当您的活动使用正常的 AppCompat 主题(例如“Theme.AppCompat.Light”)时,阴影应该看起来不错。
但是,当您使用“setSupportActionBar”(并使用适当的主题,例如“Theme.AppCompat.Light.NoActionBar”)时,阴影会出现一些问题。
对于棒棒糖之前的版本,您可以在工具栏下方放置一个 FrameLayout,它看起来与用于普通主题的完全一样,如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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="wrap_content"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/toolbar"
android:foreground="?android:windowContentOverlay"
android:visibility="@integer/action_bar_shadow_background_visibility" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/toolbar"
android:text="@string/hello_world" />
</RelativeLayout>
您可以使用 FrameLayout 作为活动的内容,或者使用我所做的。您还可以通过将整数 0 设置为 pre-lollipop 并将 2 设置为 Lollipop 及更高版本来设置其可见性,就像我对“action_bar_shadow_background_visibility”所做的那样。
这是一个丑陋的解决方案,但它有效,但仅适用于棒棒糖之前的版本。
无论如何,如果我使用“setSupportActionBar”,我仍然找不到为 Lollipop 很好地显示阴影的方法。我尝试在工具栏和操作栏上使用“setElevation”(在调用“setSupportActionBar”之后使用“getSupportActionBar”)。
我也不知道如何获得 actionbar 的标准高度,因为我注意到很多教程都说要使用“minHeight”作为工具栏。对此也将不胜感激。
谁能帮我这个?
同样,为了清楚起见,这就是我要问的:
- 对于 Pre-Lollipop,显示在工具栏和操作栏的支持库中使用的相同阴影。
- Lollipop 也一样(但使用 Lollipop 的那个)
- 额外:在 Lollipop 上自定义阴影更“精致”(可能在所有版本上自定义)。
- 额外:为什么工具栏的 minHeight 得到的是操作栏高度的值,而不是高度本身?
编辑:好的,这是迄今为止我为模仿棒棒糖的影子所做的:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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="wrap_content"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/toolbar"
layout="@layout/toolbar_action_bar_shadow" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/toolbar"
android:text="@string/hello_world" />
</RelativeLayout>
res/layout/toolbar_action_bar_shadow.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="?android:windowContentOverlay" />
res/layout-v21/toolbar_action_bar_shadow.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView 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-v21/res/layout/msl__action_bar_shadow.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- intended for lollipop and above -->
<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>
它不完全一样,但它是相似的。
编辑:我仍然不知道为什么会发生。我认为我在这个问题上写的代码具有误导性,因为要做的就是设置背景。然而在我正在测试的应用程序上它仍然没有帮助。我要修复的应用程序在导航抽屉上方有工具栏。
有一刻我认为这可能是因为我制作了一个自定义工具栏(从工具栏扩展)并且改变了它的 alpha 值(根据导航抽屉),但即使我使用普通工具栏并禁用所有相关的到 alpha,它仍然无法正常工作。此外,不仅如此,在一个全新的项目中,我尝试为工具栏设置半透明背景,并根据“setElevation”方法得到阴影。
现在我更难找到这个问题的原因,因为这似乎不是因为透明度,也不是因为自定义 Toolbar 类......
这是具有工具栏的活动的布局,以防万一这有任何帮助:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.widget.DrawerLayout
android:id="@+id/activity_main__drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/activity_main__fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:layout_marginTop="?attr/actionBarSize"
layout="@layout/activity_main__sliding_menu" />
</android.support.v4.widget.DrawerLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.app.ui.Toolbar
android:id="@+id/activity_main__toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:layoutDirection="ltr"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
tools:ignore="UnusedAttribute" />
<!-- <include -->
<!-- android:layout_width="match_parent" -->
<!-- android:layout_height="wrap_content" -->
<!-- layout="@layout/toolbar_action_bar_shadow" /> -->
</LinearLayout>
</FrameLayout>