Appcompat v21工具栏高度预棒棒糖

首先,我知道这个问题以前已经问过,但是之前没有回答过。 我希望有人能给我一个答案。

在我的应用程序中,我使用Appcompat_v7(API 21)中的工具栏。 这是我的代码:

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

这是我使用的ToolBar风格:

 <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> 

问题是,这个海拔高度不适用于棒棒糖。 所以我的问题是:是否有可能在棒棒糖设备上的工具栏下的阴影?

这对我很有帮助:

 <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> 

使用CardView容器工具栏是一个坏主意。

CardView很重,特别是对于低端设备。

最好的方法是在工具栏下方放置一个渐变阴影视图。 阴影视图必须是协调器布局的直接子视图。 即。 包含工具栏和阴影视图的appbar必须是兄弟。

将此视图组件添加到您的布局。

  <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"/> 

可绘制的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> 

这将解决前棒棒糖设备中的问题。 但是我们不想在棒棒糖和上面的设备上使用这个阴影,所以在有棒棒糖和以上的设备上看到了这个可见性。

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

完成。

您可以使用foreground="?android:windowContentOverlay"FrameLayout来添加阴影(高程)。 在Lollipop之前不支持高度属性。 所以如果你正在使用FrameLayout像片段容器只是添加前景属性。

由于CardView widget方法有问题,我使用了@Sniper提到的FrameLayout方法; 它是完美的工作!

我只是想分享你必须使用的代码片段。 把它直接放在主内容开始的工具栏下面:

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

不要忘记closures:

 </FrameLayout> 

有可能有真正的阴影 – animation和生成。 自从Froyo以来,Lollipop使用的方法就可以使用了。 硬件加速用于阴影生成是可用的,因为我猜蜂窝。 这是如何工作的:

  • 将LightingColorFilter设置为0,0,将视图绘制到离屏位图上
  • 使用ScriptIntrinsicBlur类和高程值作为半径来模糊黑色形状(离屏位图)
  • 在视图下绘制位图

它需要添加自定义高程属性,能够渲染阴影的自定义视图,以及使用渲染脚本和兼容性库(适用于较旧的设备)。 我不打算深入细节,因为其中有很多包括编译和次要性能优化的问题。 但是这是可能的。

为什么官方支持库没有阴影?

  • 这将需要在UI框架中进行更改,因为无法自由地绘制外部视图边界
  • 平滑的animation需要一个相当不错的GPU

看到:

我正在使用这个答案 :

 <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> 

要在您的工具栏下显示阴影,请使用Google Androiddevise支持库中的AppBarLayout。 这是一个如何使用它的例子。

 <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> 

要使用Google Androiddevise支持库,请在build.gradle文件中input以下内容:

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

在API 21(Android棒棒糖)之前,您不能使用高度属性。 但是,您可以以编程方式添加阴影,例如使用放置在Toolbar下方的自定义视图。

例如:

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

阴影是黑色渐变的drawable。

只要没有操作栏菜单,手动添加阴影的解决scheme就可以工作。 如果是这样,阴影视图将停止在动作条图标之前。

我认为有一个垂直的线性布局与顶部的appbar和一个下面的阴影视图作为下一个线性布局项目是比较容易的,或者在我的情况下,它是

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

我真的希望不久的将来appCompat会解决这个问题。

另一个选项是以下库,它提供了9像素的阴影,比如iosched app android-materialshadowinepatch

我想你可以,我使用支持库CardView提升有问题。 为了使它工作,我不得不这样设置我的观点。

 <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android.support.v7.cardview="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="125dp" android:orientation="horizontal" android:layout_margin="5dp" card_view:cardCornerRadius="5dp" android.support.v7.cardview:cardElevation="10dp"> </android.support.v7.widget.CardView> 

所以我认为你应该尝试在XML中这样设置它 –

 android.support.v7.toolbar:elevation="10dp" 

再次,我没有testing这个。 但是请注意,我必须使用android.support.v7才能使用它。