Android LinearLayout:围绕linearLayout添加带阴影的边框

我想创build这个linearlayout相同的边框作为例子:

在这里输入图像描述

在这个例子中,我们可以看到在linearLayout周围的边框是不一样的。 我怎样才能创build这个使用XML可绘制文件?

现在,我只能够像这样在linearlayout周围创build一个简单的边框:

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="1dp" android:topRightRadius="0dp" android:bottomRightRadius="0dp" android:bottomLeftRadius="0dp" /> <stroke android:width="1dp" android:color="#E3E3E1" /> <solid android:color="@color/blanc" /> </shape> 

尝试这个..

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="#CABBBBBB"/> <corners android:radius="2dp" /> </shape> </item> <item android:left="0dp" android:right="0dp" android:top="0dp" android:bottom="2dp"> <shape android:shape="rectangle"> <solid android:color="@android:color/white"/> <corners android:radius="2dp" /> </shape> </item> </layer-list> 

我通过使用9补丁graphics得到最好看的结果。

您可以使用以下编辑器简单地创build一个单独的9修补程序graphics: http : //inloop.github.io/shadow4android/

例:

9个补丁graphics:

9个补丁图形:

结果:

在这里输入图像描述

来源:

 <LinearLayout android:layout_width="200dp" android:layout_height="200dp" android:orientation="vertical" android:background="@drawable/my_nine_patch" 

这就是CardView存在的原因。 CardView | Android开发者
这只是一个FrameLayout,支持前棒棒糖设备的提升。

 <android.support.v7.widget.CardView xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:cardUseCompatPadding="true" app:cardElevation="4dp" app:cardCornerRadius="3dp" > <!-- put whatever you want --> </android.support.v7.widget.CardView> 

要使用这个,你需要添加依赖到build.gradle

 compile 'com.android.support:cardview-v7:23.+' 

好吧,我知道这太晚了。 但我有同样的要求。 我解决这个问题

1.首先在“drawable”文件夹中创build一个xml文件(例如:border_shadow.xml),并将下面的代码复制到其中。

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <item> <shape> <!-- set the shadow color here --> <stroke android:width="2dp" android:color="#7000" /> <!-- setting the thickness of shadow (positive value will give shadow on that side) --> <padding android:bottom="2dp" android:left="2dp" android:right="-1dp" android:top="-1dp" /> <corners android:radius="3dp" /> </shape> </item> <!-- Background --> <item> <shape> <solid android:color="#fff" /> <corners android:radius="3dp" /> </shape> </item> 

2.在你想要阴影的布局上(例如:LinearLayout)在android:background中添加这个

 <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="8dip" android:background="@drawable/border_shadow" android:orientation="vertical"> 

那为我工作。

或者,您可以使用9补丁图像作为您的布局的背景,以允许更多的“自然”阴影:

在这里输入图像描述

结果:

在这里输入图像描述

把图像放在你的/res/drawable文件夹中。
确保文件扩展名是.9.png ,而不是.png

顺便说一下,这是在API 19 sdk resources文件夹中find的现有资源的修改(减小到最小平方尺寸)。
我留下了红色标记,因为它们看起来没有什么害处,如draw9patch工具所示。

[编辑]

大约9个补丁,如果你从来没有与他们有任何关系。

只需将其添加为您的视图的背景。

黑色标记的区域(左和上)将伸展(垂直,水平)。
黑色标记的区域(右侧,底部)定义了“内容区域”(可以添加文本或视图的位置),如果需要,可以调用未标记的区域“填充”。

教程: http : //radleymarx.com/blog/simple-guide-to-9-patch/

这很简单:

用这样的渐变创build一个可绘制的文件:

对于视图below_shadow.xml下的阴影

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:startColor="#20000000" android:endColor="@android:color/transparent" android:angle="270" > </gradient> </shape> 

查看above_shadow.xml上方的阴影

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:startColor="#20000000" android:endColor="@android:color/transparent" android:angle="90" > </gradient> </shape> 

等左右阴影只是改变梯度的angular度:)

用名字drop_shadow.xml创build一个可绘制的文件.xml:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!--<item android:state_pressed="true"> <layer-list> <item android:left="4dp" android:top="4dp"> <shape> <solid android:color="#35000000" /> <corners android:radius="2dp"/> </shape> </item> ... </layer-list> </item>--> <item> <layer-list> <!-- SHADOW LAYER --> <!--<item android:top="4dp" android:left="4dp"> <shape> <solid android:color="#35000000" /> <corners android:radius="2dp" /> </shape> </item>--> <!-- SHADOW LAYER --> <item> <shape> <solid android:color="#35000000" /> <corners android:radius="2dp" /> </shape> </item> <!-- CONTENT LAYER --> <item android:bottom="3dp" android:left="1dp" android:right="3dp" android:top="1dp"> <shape> <solid android:color="#ffffff" /> <corners android:radius="1dp" /> </shape> </item> </layer-list> </item> </selector> 

然后:

 <LinearLayout ... android:background="@drawable/drop_shadow"/> 

我find了解决这个问题的最好方法。

  1. 您需要在布局上设置一个坚实的矩形背景。

  2. 使用此代码 – ViewCompat.setElevation(view , value)

  3. 在父级布局中设置android:clipToPadding="false"

Ya Mahdi aj —为RelativeLayout

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <gradient android:startColor="#7d000000" android:endColor="@android:color/transparent" android:angle="90" > </gradient> <corners android:radius="2dp" /> </shape> </item> <item android:left="0dp" android:right="3dp" android:top="0dp" android:bottom="3dp"> <shape android:shape="rectangle"> <padding android:bottom="40dp" android:top="40dp" android:right="10dp" android:left="10dp" > </padding> <solid android:color="@color/Whitetransparent"/> <corners android:radius="2dp" /> </shape> </item> </layer-list> 

你可以用9个补丁graphics来做,但这是错误的,因为你必须使用png文件。 我认为你应该使用XML文件(可绘制文件)。 尝试使用此代码

 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="3dp" android:layout_marginLeft="3dp" android:layout_marginRight="3dp" android:background="@drawable/gradient_top"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <LinearLayout android:layout_width="3dp" android:layout_height="match_parent" android:layout_marginBottom="3dp" android:background="@drawable/gradient_left"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="3dp" android:layout_marginBottom="3dp" android:background="@color/md_white_1000" android:orientation="vertical"> </LinearLayout> <LinearLayout android:layout_width="3dp" android:layout_height="match_parent" android:layout_marginLeft="-4dp" android:layout_marginBottom="3dp" android:background="@drawable/gradient_right"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="3dp" android:layout_marginTop="-4dp" android:layout_marginLeft="3dp" android:layout_marginRight="3dp" android:background="@drawable/gradient_bottom"/> 

gradient_top.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#dadada" android:endColor="#f2f2f2" android:angle="90"/> </shape> 

gradient_left.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#dadada" android:endColor="#f2f2f2" android:angle="180"/> </shape> 

gradient_right.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#dadada" android:endColor="#f2f2f2" android:angle="0"/> </shape> 

gradient_bottom.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#dadada" android:endColor="#f2f2f2" android:angle="270"/> </shape> 

在这里输入图像描述