如何在android中的视图上方添加阴影

时间:2015-12-14 20:37:53

标签: android android-layout material-design

我有一个视图是服务器作为页脚标题。这只是一个视图,您可以将其视为按钮或文本视图或布局(我对任何事情都很开放)。这是xml

<RelativeLayout>
   <ScrollView >… </ScrollView> //match parent width and height
   <MyBottomView/> // align parent bottom
 </RelativeLayout>

因此,您可以看到ScrollView在MyBottomView下方滚动。我想在MyBottomView中添加一个顶部阴影,使其看起来更像Material Design。我怎么能这样做?

4 个答案:

答案 0 :(得分:21)

如果您需要在视图的一侧(例如在顶部)设置阴影,则可以在其前添加另一个视图,并使用渐变阴影作为其背景。

以下是您必须存储在top_shadow_gradient.xml文件夹中的渐变文件drawable

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

以下是如何使用它的示例布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:orientation="vertical">

    <View
        android:layout_width="match_parent"
        android:layout_height="8dp"
        android:background="@drawable/top_shadow_gradient" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:orientation="vertical"
        android:paddingTop="8dp">

        <!-- Put your content here-->

    </LinearLayout>

</LinearLayout>

重要提示:根布局必须透明(android:background="@android:color/transparent")和您的内容&#34;布局需要有白色背景(android:background="#ffffff")。

这就是结果: enter image description here

答案 1 :(得分:5)

以下是此问题的一些解决方案 - 选择最佳:

  

在Android中没有这样的属性来显示阴影。但可能的方法是:

     
      
  1. 添加一个灰色的普通LinearLayout,在其上添加您的实际布局,底部和右侧的边距等于1或2 dp

  2.   
  3. 使用带阴影的9补丁图像并将其设置为线性布局的背景

  4.   

  

通过实现一个将作为LinearLayoout背景的图层列表,还有另一个问题的解决方案。

     

将background_with_shadow.xml文件添加到res/drawable。含有:

<?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="@android:color/darker_gray" />
        <corners android:radius="5dp"/>
        </shape>
    </item>
    <item android:right="1dp" android:left="1dp" android:bottom="2dp">
        <shape 
            android:shape="rectangle">
        <solid android:color="@android:color/white"/>
        <corners android:radius="5dp"/>
        </shape>
    </item>
</layer-list>
     

然后在LINELayout中添加图层列表作为背景。

<LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/background_with_shadow"/>

您还可以阅读:http://odedhb.blogspot.com/2013/05/android-layout-shadow-without-9-patch.html

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:padding="10dp"
    android:background="#CC55CC">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TableLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:stretchColumns="0">
            <TableRow>
                <LinearLayout
                    android:id="@+id/content"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">
                    <TextView  
                        android:layout_width="fill_parent" 
                        android:layout_height="wrap_content"
                        android:background="#FFFFFF" 
                        android:text="@string/hello" />
                </LinearLayout>
                <View
                    android:layout_width="5dp"
                    android:layout_height="fill_parent"
                    android:layout_marginTop="5dp"
                    android:background="#55000000"/>
            </TableRow>
        </TableLayout>
        <View
            android:layout_width="fill_parent"
            android:layout_height="5dp"
            android:layout_marginLeft="5dp"
            android:background="#55000000"/>
    </LinearLayout>
</FrameLayout>
  • 您还可以使用特定的可绘制表单Android资源来模仿阴影效果。请看:thttps://stackoverflow.com/questions/21211870/android-view-shadow或者只是阅读下面的帖子:
  

我正在使用Android Studio 0.8.6而我找不到:

android:background="@drawable/abc_menu_dropdown_panel_holo_light"
     

所以我找到了这个:

android:background="@android:drawable/dialog_holo_light_frame"
     

它看起来像这样:

     

![在此处输入图片说明] [1]

     

[1]:http://i.stack.imgur.com/tId9L.jpg

如果您对清洁材料设计效果感兴趣,请阅读以下文档:

答案 2 :(得分:4)

在黑客攻击中,我发现这是将视图包装在父级中并使用旋转。例如。如果你有一个cardview并且正在为它添加高程,你可以像这样放两个旋转来实现上面而不是下面的阴影:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:paddingBottom="10dp"
    android:rotation="180">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:rotation="180"
        app:cardElevation="8dp">
    <!--Card view content-->
    </android.support.v7.widget.CardView>
</RelativeLayout>

这给出了附件截图。

enter image description here

这还有一个问题 - 这需要在父布局上设置paddingBottom,这意味着布局上方的任何可滚动的兄弟都不会低于它。

因此,即使在今天的高程和大纲提供者时代,也可以更好地添加半透明视图。 :(

答案 3 :(得分:0)

仅顶部阴影:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<item>
    <shape>
        <padding
            android:top="@dimen/_2sdp" />
        <solid android:color="@color/red" />
        <corners android:radius="@dimen/_8sdp" />
    </shape>
</item>

<!-- Background -->
<item>
    <shape>
        <solid android:color="@color/white" />
        <corners android:radius="@dimen/_8sdp" />
    </shape>
</item>

如果您希望阴影出现在其他区域,请添加内边距 bottomrightleft

结果:

1