【问题标题】:Android: Appcompat 21 how to add shadow on actionbarAndroid:Appcompat 21 如何在操作栏上添加阴影
【发布时间】:2014-12-30 13:09:51
【问题描述】:

我从新的 appcompat 添加了新的材料设计操作栏,并使用了新的工具栏小部件。我在 xml 的工具栏上设置了自定义背景,但我的问题是没有显示来自操作栏的阴影。你知道怎么做吗?

工具栏代码

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/my_awesome_toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@drawable/ab_background_textured"
    app:theme="@style/MyTheme"
    app:popupTheme="@style/MyTheme.Popup"/>

我的主题风格

<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
    <item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
    <item name="android:textColorSecondary">#ffff8800</item>
</style>

MyTheme.Popup 样式

<style name="MyTheme.Popup" parent="ThemeOverlay.AppCompat.Dark">
    <item name="android:textColor">#ffffff</item>
</style>

更新

就像@Justin Powell 建议我在我的主题上添加actionBarStyle,但仍然没有阴影。

MyTheme 风格(更新)

<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
    <item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
    <item name="android:textColorSecondary">#ffff8800</item>
    <item name="android:actionBarStyle">@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse</item>
</style>

【问题讨论】:

标签: android android-5.0-lollipop android-actionbar-compat


【解决方案1】:

我发现 Google IO 应用程序中的解决方案对我自己来说是可以接受的,但没有看到任何博客或 Stackoverflow 帖子完全解释它。您可以做的是从https://github.com/google/iosched/blob/36d88985ff6813fa9035530cd426393720a6f7b4/android/src/main/res/drawable-xxhdpi/bottom_shadow.9.png 获取他们的 Apache 2 许可抽屉阴影资产,然后在您的 Activity 布局中:

<RelativeLayout android:layout_width="match_parent"
                android:layout_height="match_parent">
    <include android:id="@+id/toolbar"
             layout="@layout/toolbar"/>

    <FrameLayout android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:layout_below="@id/toolbar"
                 android:foreground="@drawable/header_shadow">
    <!-- YOUR STUFF HERE -->
    </FrameLayout>
</RelativeLayout>

而标题阴影是

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="header_shadow" type="drawable">@drawable/bottom_shadow</item>
</resources>

对于 API 级别 https://github.com/google/iosched/blob/8c798c58e592b8a25111610e216c7f3ee74c3a42/android/src/main/res/values/refs.xml 和https://github.com/google/iosched/blob/8c798c58e592b8a25111610e216c7f3ee74c3a42/android/src/main/res/values-v21/refs.xml

更详细地说,这里是toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        app:theme="@style/ToolbarTheme"
        app:popupTheme="@style/AppTheme"/>

【讨论】:

  • 哦,这太可怕了,但似乎是一种合理的方法。我要试试这个。谢谢!
  • 你不会在 >= Lollipop 上有两个阴影吗?
  • 不,你不会得到 2 个阴影,因为 21 及以上的 header_shadow 为空。请参阅 values-v21 中的 refs.xml。
  • @FabianFrank 为什么你只使用 FrameLayout 来做阴影,我们只使用普通的 View 类
  • 对我不起作用。阴影应用于从顶部到引导屏幕的所有布局。真烂。和谷歌支持库一样糟糕。
【解决方案2】:

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>
    <item name="logo">@drawable/ab_logo</item>
    <item name="displayOptions">useLogo|showHome|showTitle|showCustom</item>
</style>

添加到基本主题

  <style name="BaseTheme" parent="Theme.AppCompat.Light">
            <item name="android:homeAsUpIndicator">@drawable/home_back</item>
            <item name="actionBarStyle">@style/TFKBTheme.ActionBar</item>
    </style>

【讨论】:

    【解决方案3】:

    这就是我显示阴影的方式:

    <!-- API level 21 and above then the elevation attribute is enough. For some reason it can't be set directly on the include so I wrap it in a FrameLayout -->
    <FrameLayout
        android:id="@+id/topwrapper"
        android:background="@color/theme_primary"
        android:elevation="4dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <include layout="@layout/toolbar_actionbar" />
    </FrameLayout>
    
    <FrameLayout
        android:layout_below="@id/topwrapper"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <WebView
            android:id="@+id/webview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <!-- This topshadow is hidden in code for API level 21 and above -->
        <include layout="@layout/topshadow" />
    </FrameLayout>
    

    然后topshadow布局是这样的(调整5dp得到你想要的阴影高度):

    <View xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:id="@+id/shadow_prelollipop"
        android:background="@drawable/background_shadow" />
    

    background_shadow.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
    
        <gradient
            android:startColor="#02444444"
            android:endColor="#33111111"
            android:angle="90"></gradient>
    </shape>
    

    toolbar_actionbar.xml

    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:myapp="http://schemas.android.com/apk/res-auto"
        myapp:theme="@style/ActionBarThemeOverlay"
        myapp:popupTheme="@style/ActionBarPopupThemeOverlay"
        android:id="@+id/toolbar_actionbar"
        android:background="@color/theme_primary"
        myapp:titleTextAppearance="@style/ActionBar.TitleText"
        myapp:contentInsetStart="?actionBarInsetStart"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize" />
    

    【讨论】:

      【解决方案4】:

      对于 5.0 之前的布局,您可以通过将 foreground="?android:windowContentOverlay" 添加到内容的 FrameLayout 来将阴影添加回工具栏下方的内容。

      例如:

      <?xml version="1.0" encoding="utf-8"?>
      <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="wrap_content"
          android:minHeight="?attr/actionBarSize"
          app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
      
      <FrameLayout
          android:id="@+id/fragmentContainer"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:foreground="?android:windowContentOverlay"
          />
      
      </LinearLayout>
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多