2011-03-04 30 views
94

是否可以在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> 

回答

7

如果你不介意做一些定制与画布绘制API,看看这个答案约drop shadows。这是一个follow-up问题,它修复了原始问题。

23

以下工作适用于我:只保存为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> 
2

我觉得这个阴影值适用于大多数情况下:

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

这是我要做的事:

Android Native Button with Shadows

代码波纹管的一个按钮状态:

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

那么你应该有与按钮的diferent版本,就像一个选择:

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

希望这可以帮助you..good运气

+0

真的很酷!! – MastAvalons 2012-08-21 14:01:31

+0

是非常好的jmachete。只需要一点调整就可以了。 +1 – 2013-02-08 21:39:40

+0

非常感谢你的好例子。这帮助了我很多。 – Kailas 2013-10-30 05:09:52

19

我觉得这个方法产生了很好的效果:

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

+0

谢谢,Joakim。我发现这非常有用。 – BruceHill 2013-03-29 21:58:04

130

搜索后大量的最终我得到了这个

enter image description here

<?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> 
+1

很好...很好的工作 – 2014-08-01 11:49:39

+1

我真的需要这个,非常感谢! – Eddy 2014-10-23 08:38:06

+0

这正是我正在寻找的。完善。 – daVe 2014-11-14 17:14:57

35

这是我的版本阴影的。我正在为所有形状周围的朦胧阴影,并使用this answerJoakim Lundborg作为我的出发点。我改变的是为所有影子项目添加角点并为每个后续影子项目增加角点的半径。因此,这里的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> 
+0

谢谢。这是最好的答案。给出了一个很好的模糊投影。 – 2015-06-19 10:06:30

+0

几乎同意,这个解决方案给出了很好的结果 – Sergey 2018-03-07 11:17:48

2

enter image description here

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

老问题,但海拔,可提供材质设计现在提供了一个阴影的任何意见。

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

请参阅该文档在https://developer.android.com/training/material/shadows-clipping.html

+0

谢谢你,非常有用和简单。这就是我要找的。 – aul 2016-08-16 23:38:58

+0

嗯/这个答案需要成为顶尖人物!人们仍然沉默寡言,用旧的方法来解决这一习俗阴影 – Sergey 2018-03-07 03:27:55