如何在所有Android版本上显示支持库的ActionBar和工具栏的阴影?

这是一个简单的问题:

我使用新的支持库,它允许我有一个工具栏实例,甚至将其设置为活动的actionBar(或使用默认的)。

如何自定义工具栏(或默认ActionBar)投射的阴影?

我试过使用“setElevation”(两者都有),但它似乎没有在Android Lollipop上做任何事情。

另外,我找不到如何在Lollipop前版本上自定义阴影。 可能有这个API吗? 或至少是一个drawable(我没有find,即使我已经尝试过)?


好的,我已经设法find了下一件事:

对于Lollipop和pre-Lollipop,当您的活动使用正常的AppCompat主题(例如“Theme.AppCompat.Light”)时,阴影看起来应该很好。

但是,当您使用“setSupportActionBar”(并使用适当的主题,例如“Theme.AppCompat.Light.NoActionBar”)时,您将遇到阴影的一些问题。

对于pre-Lollipop,你可以在工具栏下面放置一个FrameLayout,它看起来就像用于普通主题的那样,如下所示:

     

您可以使用FrameLayout作为活动的内容,或使用我所做的。 您还可以通过为棒棒糖前置整数0和为棒棒糖及以上版本放置2来设置其可见性,就像我使用“action_bar_shadow_background_visibility”一样。

这是一个丑陋的解决方案,但它可以工作,但仅限于前Lollipop版本。

在任何情况下,我仍然找不到一种方法来为棒棒糖显示阴影,以防我使用“setSupportActionBar”。 我尝试在工具栏和操作栏上使用“setElevation”(在调用“setSupportActionBar”之后立即使用“getSupportActionBar”)。

我也没有得到如何获得动作栏的标准高度,因为我注意到很多教程说使用“minHeight”作为工具栏。 非常感谢这方面的帮助。

谁能帮我这个?

再说一次,为了说清楚,这就是我的要求:

  • 对于Pre-Lollipop,显示在工具栏和ActionBar的支持库上使用的相同阴影。
  • Lollipop相同(但使用Lollipop拥有的那个)
  • 额外:在Lollipop上自定义阴影更加“精致”(也许可以在所有版本上自定义)。
  • 额外:为什么工具栏的minHeight获取操作栏高度的值,而不是高度本身?

编辑:好的,到目前为止,这是模仿Lollipop的影子:

      

RES /布局/ toolbar_action_bar_shadow.xml

   

RES /布局-V21 / toolbar_action_bar_shadow.xml

   

RES /抽拉-V21 / RES /布局/ msl__action_bar_shadow.xml

           

它不完全相同,但它是相似的。


编辑:我仍然不知道为什么会这样。 我认为我在这个问题上写的代码是误导性的,因为所有要做的就是设置背景。 然而在我正在测试它的应用程序仍然无济于事。 我正在尝试修复的应用程序在导航抽屉上方有工具栏。

有一会儿,我认为可能是因为我制作了一个自定义工具栏(从工具栏扩展)并改变了它的alpha值(根据导航抽屉),但即使我使用普通工具栏并禁用所有相关内容到alpha,它仍然无法正常工作。 此外,不仅如此,而且在一个全新的项目中,我试图为工具栏设置半透明背景,并根据“setElevation”方法得到阴影。

现在我更难find导致这个问题的原因,因为它似乎不是因为透明而不是因为自定义工具栏类……

这是包含工具栏的活动的布局,以防这可能有任何帮助:

         <!--       

  • java.lang.RuntimeException:未知的animation名称:objectAnimator
  • openOptionsMenu()在appcompat-v7 22.1.0或更新版本中不起作用
  • Androiddevise支持库24.2.1使BottomSheet在启动时打开
  • ClassCastException:CustomFragment不能转换为android.app.Fragment /使用android.support.v4.app.Fragment
  • 将JS和CSS支持添加到Android Studio项目
  • 如何处理多片段活动中的onContextItemSelected?
  • Android支持库ActionBar不工作在2.3设备
  • 包android.support.v7.internal.view.menu不存在:找不到符号类MenuBuilder
  • 据我所知/可以阅读,AppCompat库目前不会渲染任何阴影。 调用似乎在那里(例如ViewCompat.setElevation(View view, float elevation) )但它似乎没有做任何事情。

    所以我想你现在需要求助于添加自己的阴影,至少在支持库实现阴影渲染之前。

    查看Google IO 2014源代码,他们已实现如下:

    • DrawShadowFrameLayout可以将背景绘制为阴影
    • bottom_shadow.9.png表示动作栏下方的阴影
    • app:shadowDrawable属性设置阴影可绘制
    • DrawShadowFrameLayout上的setShadowTopOffset()将阴影向下移动,使其显示在操作栏下方。 (你需要自己设置)

    有关此Reddit线程和堆栈 溢出的更多信息。

    这是我在我的一个应用程序中所做的,它显示阴影(人工阴影):

             ....  ....      

    toolbar_dropshadow.xml:

            

    我正在使用地图活动,所有这些都在我的地图视图中显示出美妙的阴影。

    希望这可以帮助…