有什么办法可以在API <21(5.0 Lolipop)中做一个材质风格的阴影吗?

材料devise非常强调“纸张”的隐喻。 要做到这些,阴影是必不可less的。 由于材料devise是一种哲学而不是API (尽pipe它被构build到L中),这应该在任何地方完成(Windows窗体,HTML / CSS等)。 如何在Android API 14至20中执行此操作?

请注意,预制PNGs对于圆形和其他非方形形状来说不会那么实际。

Solutions Collecting From Web of "有什么办法可以在API <21(5.0 Lolipop)中做一个材质风格的阴影吗?"

如果您不担心Lollipop的向后兼容性,可以直接在XML中设置高程属性

android:elevation="10dp" 

否则,您必须使用support.v4.ViewCompat库将其设置为Java。

  ViewCompat.setElevation(myView, 10); 

并将其添加到您的build.gradle

  compile 'com.android.support:support-v4:21.+' 

http://developer.android.com/reference/android/support/v4/view/ViewCompat.html#setElevation(android.view.View,%20float&#xFF09;

在前棒棒糖渲染阴影是不容易的,但可能的。 诀窍在于,影子只是一种黑色,模糊的视野形状。 你可以自己做。

  1. 使用LightingColorFilter(0,0)设置将阴影投影视图绘制到位图
  2. 使用ScriptIntrisincBlur模糊它
  3. 绘制形状
  4. 在形状的顶部绘制视图

听起来lika有很多代码可以写,但是适用于所有情况,所以你可以很容易地覆盖你所有的视图。

这里只是一个粗略的例子…

 <?xml version="1.0" encoding="utf-8"?> 

 <!-- Drop Shadow Stack --> <item> <shape android:shape="oval"> <corners android:radius="64dp"/> <solid android:color="#009A3D"/> <size android:width="64dp" android:height="64dp"/> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#00CCCCCC"/> </shape> </item> <item> <shape android:shape="oval"> <corners android:radius="64dp"/> <solid android:color="#009A3D"/> <size android:width="64dp" android:height="64dp"/> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#10CCCCCC"/> </shape> </item> <item> <shape android:shape="oval"> <corners android:radius="64dp"/> <solid android:color="#009A3D"/> <size android:width="64dp" android:height="64dp"/> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#20CCCCCC"/> </shape> </item> <item> <shape android:shape="oval"> <corners android:radius="64dp"/> <solid android:color="#009A3D"/> <size android:width="64dp" android:height="64dp"/> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#30CCCCCC"/> </shape> </item> <item> <shape android:shape="oval"> <corners android:radius="64dp"/> <solid android:color="#009A3D"/> <size android:width="64dp" android:height="64dp"/> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#50CCCCCC"/> </shape> </item> <!-- Background --> <item> <shape android:shape="oval"> <corners android:radius="64dp"/> <solid android:color="#009A3D"/> <size android:width="64dp" android:height="64dp"/> </shape> </item> 

在你的布局文件中,你可以使用它…

 <Button android:id="@+id/add_btn" android:text="+" android:textColor="#FFFDFC" android:textSize="44sp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginRight="50dp" android:layout_marginBottom="40dp" android:layout_width="64dp" android:layout_height="64dp" android:clickable="true" android:enabled="true" android:singleLine="false" android:layout_alignParentTop="false" android:background="@drawable/round_button"/> 

浮动动作button(带阴影)可以在旧的平台上用一个简单的java类来模拟。

我在这里使用Faiz Malkani的版本: https : //github.com/FaizMalkani/FloatingActionButton

[注意,为了使其与Gingerbread兼容,您需要在代码中对animation和透明度调用进行一些SDK版本检查。]

你可以使用android.support.v7.widget.CardView。

也许不是完美的解决scheme,但对我来说,正在努力工作。 所以,例如,这是我在我的应用程序上使用的技巧…在一个矩形的形状,我很高兴的结果。

 private View.OnTouchListener touch = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { final android.support.v7.widget.CardView card_view = (android.support.v7.widget.CardView) ((View) v.getParent()).findViewById(R.id.card_view); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: card_view.setCardElevation(6); card_view.setScaleX(1.007f); card_view.setScaleY(1.007f); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: card_view.setCardElevation(3); card_view.setScaleX(1f); card_view.setScaleY(1f); break; } return false; } }; 

在xml文件中我使用:

 <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="match_parent" card_view:cardCornerRadius="2dp" card_view:cardMaxElevation="6dp" card_view:cardElevation="3dp">