在Android上添加阴影到自定义形状

有没有可能在Android中添加投影到自定义形状? 查看完文档后,我只能看到应用文字阴影的方法。

我已经试过这个没有运气:

<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#90ffffff"/> <corners android:radius="12dp" /> <item name="android:shadowColor">#000000</item> <item name="android:shadowRadius">5</item> <item name="android:shadowDy">3</item> </shape> 

经过大量的search终于我得到了这个

在这里输入图像说明

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Bottom 2dp Shadow --> <item> <shape android:shape="rectangle"> <solid android:color="#d8d8d8" /> <corners android:radius="7dp" /> </shape> </item> <!-- White Top color --> <item android:bottom="3px"> <shape android:shape="rectangle"> <solid android:color="#FFFFFF" /> <corners android:radius="7dp" /> </shape> </item> </layer-list> 

这是我如何做到的:

Android的本机按钮与阴影

代码一个button的状态:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- "background shadow" --> <item> <shape android:shape="rectangle" > <solid android:color="#000000" /> <corners android:radius="15dp" /> </shape> </item> <!-- background color --> <item android:bottom="3px" android:left="3px" android:right="3px" android:top="3px"> <shape android:shape="rectangle" > <solid android:color="#cc2b2b" /> <corners android:radius="8dp" /> </shape> </item> <!-- over left shadow --> <item> <shape android:shape="rectangle" > <gradient android:angle="180" android:centerColor="#00FF0000" android:centerX="0.9" android:endColor="#99000000" android:startColor="#00FF0000" /> <corners android:radius="8dp" /> </shape> </item> <!-- over right shadow --> <item> <shape android:shape="rectangle" > <gradient android:angle="360" android:centerColor="#00FF0000" android:centerX="0.9" android:endColor="#99000000" android:startColor="#00FF0000" /> <corners android:radius="8dp" /> </shape> </item> <!-- over top shadow --> <item> <shape android:shape="rectangle" > <gradient android:angle="-90" android:centerColor="#00FF0000" android:centerY="0.9" android:endColor="#00FF0000" android:startColor="#99000000" android:type="linear" /> <corners android:radius="8dp" /> </shape> </item> <!-- over bottom shadow --> <item> <shape android:shape="rectangle" > <gradient android:angle="90" android:centerColor="#00FF0000" android:centerY="0.9" android:endColor="#00FF0000" android:startColor="#99000000" android:type="linear" /> <corners android:radius="8dp" /> </shape> </item> </layer-list> 

那么你应该有一个select器与不同版本的button,如下所示:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_button_red_pressed" android:state_pressed="true"/> <!-- pressed --> <item android:drawable="@drawable/ic_button_red_selected" android:state_focused="true"/> <!-- focused --> <item android:drawable="@drawable/ic_button_red_selected" android:state_selected="true"/> <!-- selected --> <item android:drawable="@drawable/ic_button_red_default"/> <!-- default --> </selector> 

希望这可以帮助你..祝你好运

这是我的投影版本。 我想要在模型周围朦胧的阴影,并用Joakim Lundborg的 这个答案作为我的出发点。 我改变的是为所有影子项目添加angular点并为每个后续影子项目增加angular点的半径。 所以这里是xml

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Drop Shadow Stack --> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#02000000" /> <corners android:radius="8dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#05000000" /> <corners android:radius="7dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#10000000" /> <corners android:radius="6dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#15000000" /> <corners android:radius="5dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#20000000" /> <corners android:radius="4dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#25000000" /> <corners android:radius="3dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#30000000" /> <corners android:radius="3dp" /> </shape> </item> <!-- Background --> <item> <shape> <solid android:color="#0099CC" /> <corners android:radius="3dp" /> </shape> </item> </layer-list> 

以下为我工作:只需保存为custom_shape.xml。

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- "shadow" --> <item> <shape android:shape="rectangle" > <solid android:color="#000000"/> <corners android:radius="12dp" /> </shape> </item> <item android:bottom="3px"> <shape android:shape="rectangle"> <solid android:color="#90ffffff"/> <corners android:radius="12dp" /> </shape> </item> </layer-list> 

我认为这种方法产生了非常好的结果:

 <!-- Drop Shadow Stack --> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#00CCCCCC"/> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#10CCCCCC"/> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#20CCCCCC"/> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#30CCCCCC"/> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#50CCCCCC"/> </shape> </item> <item> <shape android:shape="rectangle"> <stroke android:color="#CCC" android:width="1dp"/> <solid android:color="#FFF" /> <corners android:radius="2dp" /> </shape> </item> 

我发现这个: http : //www.uifuel.com/android-creating-a-drop-shadow-in-xml-layout/

如果您不介意使用Canvas API进行一些自定义绘图,请查看有关阴影的答案。 下面是一个解决原始问题的后续问题。

我认为这个投影值对于大多数情况是很好的:

 <solid android:color="#20000000" /> 

在这里输入图像说明

  <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@android:color/white" > </solid> <stroke android:width="1dp" android:color="@color/LightGrey" > </stroke> <padding android:bottom="5dp" android:left="2dp" android:right="2dp" android:top="5dp" > </padding> <corners android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp" android:radius="12dp" android:topLeftRadius="20dp" android:topRightRadius="20dp" /> <gradient android:angle="90" android:centerColor="@android:color/white" android:centerY="0.2" android:endColor="#99e0e0e0" android:startColor="@android:color/white" android:type="linear" /> </shape> 

旧的问题,但现在的材料devise提供的立面,提供了任何意见的影子。

 <TextView android:id="@+id/myview" ... android:elevation="2dp" android:background="@drawable/myrect" /> 

请参阅https://developer.android.com/training/material/shadows-clipping.html上的文档;