Android View阴影

lon*_*ker 90 android shadow dropshadow

我四处搜寻,找不到合适的方法.我想对我的观点产生以下阴影效果: 在此输入图像描述

在此输入图像描述

说实话,我不知道第二个是否通过应用阴影效果来完成.有任何想法吗?

Ric*_*ick 149

我知道这个问题已经回答了,但我希望你知道,我发现了一个drawableAndroid Studio这是非常相似的,你在这个问题有图片:看看这个:

android:background="@drawable/abc_menu_dropdown_panel_holo_light"
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

在此输入图像描述

希望它会有所帮助

编辑

上面的选项适用于旧版本,Android Studio因此您可能找不到它.对于较新的版本:

android:background="@android:drawable/dialog_holo_light_frame"
Run Code Online (Sandbox Code Playgroud)

此外,如果你想拥有自己的自定义形状,我建议使用类似的绘图软件Photoshop并绘制它.

在此输入图像描述

不要忘了将它保存为.9.png文件(例如:my_background.9.png)

阅读文档:绘制9补丁

编辑2

一个更好,更难以工作的解决方案是使用a CardView和set app:cardPreventCornerOverlap="false"来防止视图与边框重叠:

<android.support.v7.widget.CardView
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="2dp"
    app:cardElevation="2dp"
    app:cardPreventCornerOverlap="false"
    app:contentPadding="0dp">

    <!-- your layout stuff here -->

</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

还要确保包含最新版本build.gradle,当前是

compile 'com.android.support:cardview-v7:26.0.0'
Run Code Online (Sandbox Code Playgroud)

  • 真棒.只是未来观众的一个FYI,这是在`/ <sdk-path>/extras/android/support`中. (6认同)
  • 怎么样使用`cardView` (2认同)

Rep*_*epo 98

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

android:background="@drawable/abc_menu_dropdown_panel_holo_light"
Run Code Online (Sandbox Code Playgroud)

所以我找到了这个:

android:background="@android:drawable/dialog_holo_light_frame"
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

在此输入图像描述

  • 但我们不能用它添加圆角半径?! (3认同)

Moh*_*lim 32

放置背景@android:drawable/dialog_holo_light_frame,给出阴影,但你不能改变背景颜色或边框样式,所以最好从它的阴影中受益,同时仍然能够通过图层列表放置背景

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--the shadow comes from here-->
    <item
        android:bottom="0dp"
        android:drawable="@android:drawable/dialog_holo_light_frame"
        android:left="0dp"
        android:right="0dp"
        android:top="0dp">

    </item>

    <item
        android:bottom="0dp"
        android:left="0dp"
        android:right="0dp"
        android:top="0dp">
        <!--whatever you want in the background, here i preferred solid white -->
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white" />

        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

将它保存在say下的drawable文件夹中 shadow.xml

要将它分配给视图,在xml布局文件中设置它的背景

android:background="@drawable/shadow"
Run Code Online (Sandbox Code Playgroud)

  • 在我尝试过的所有方法中,这是唯一有效的方法,谢谢。 (2认同)

小智 31

使用以下代码在res/drawable文件夹中创建card_background.xml:

<?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="#BDBDBD"/>
        <corners android:radius="5dp"/>
    </shape>
</item>

<item
    android:left="0dp"
    android:right="0dp"
    android:top="0dp"
    android:bottom="2dp">
    <shape android:shape="rectangle">
        <solid android:color="#ffffff"/>
        <corners android:radius="5dp"/>
    </shape>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

然后将以下代码添加到要布局卡的元素

android:background="@drawable/card_background"
Run Code Online (Sandbox Code Playgroud)

以下行定义卡的阴影颜色

<solid android:color="#BDBDBD"/>
Run Code Online (Sandbox Code Playgroud)

  • 这不是真正的影子 - 因为它不会褪色.它更像是两侧的边界. (8认同)

Ily*_*man 23

CardView为您提供Android 5+中的真实阴影,并且它有一个支持库.用它包装你的视图就完成了.

<android.support.v7.widget.CardView>
     <MyLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

它需要下一个依赖项.

dependencies {
    ...
    compile 'com.android.support:cardview-v7:21.0.+'
}
Run Code Online (Sandbox Code Playgroud)


小智 20

使用elevation属性来实现阴影效果:

<View ...
    android:elevation="2dp"/>
Run Code Online (Sandbox Code Playgroud)

这只是在v21之后使用,请查看此链接:http://developer.android.com/training/material/shadows-clipping.html


ral*_*abb 12

这可能会迟到但对于那些仍在寻找答案的人我在git hub上找到了一个项目,这是唯一一个真正符合我需求的项目.Android的materialshadowninepatch

只需在build.gradle依赖项上添加此行

compile 'com.h6ah4i.android.materialshadowninepatch:materialshadowninepatch:0.6.3'
Run Code Online (Sandbox Code Playgroud)

干杯.竖起大拇指为创作者!happycodings


won*_*suc 9

我知道这很愚蠢,
但是如果您想在 v21 下支持,这是我的成就。

rectangle_with_10dp_radius_white_bg_and_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Shadow layers -->
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_1" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_2" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_3" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_4" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_5" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_6" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_7" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_8" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_9" />
        </shape>
    </item>
    <item
        android:left="1dp"
        android:right="1dp"
        android:top="3dp">
        <shape>
            <corners android:radius="10dp" />
            <padding
                android:bottom="1.8dp"
                android:left="1dp"
                android:right="1dp"
                android:top="1dp" />
            <solid android:color="@color/shadow_hack_level_10" />
        </shape>
    </item>

    <!-- Background layer -->
    <item>
        <shape>
            <solid android:color="@android:color/white" />
            <corners android:radius="10dp" />
        </shape>
    </item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

rectangle_with_10dp_radius_white_bg_and_shadow.xml (v21)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/white" />
    <corners android:radius="10dp" />
</shape>
Run Code Online (Sandbox Code Playgroud)

view_incoming.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/rectangle_with_10dp_radius_white_bg_and_shadow"
    android:elevation="7dp"
    android:gravity="center"
    android:minWidth="240dp"
    android:minHeight="240dp"
    android:orientation="horizontal"
    android:padding="16dp"
    tools:targetApi="lollipop">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="Hello World !" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

这是结果:

在 v21 下(这是您用 xml 制作的) 在此处输入图片说明

v21以上(真实高程渲染) 在此处输入图片说明

  • 一个显着的区别是它将占据视图的内部空间,因此您的实际内容区域可以小于>= 棒棒糖设备。


Sha*_*van 6

如果您需要正确应用阴影,则必须执行以下操作。

考虑使用背景可绘制对象定义的此视图:

<TextView
    android:id="@+id/myview"
    ...
    android:elevation="2dp"
    android:background="@drawable/myrect" />
Run Code Online (Sandbox Code Playgroud)

背景可绘制对象定义为带圆角的矩形:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#42000000" />
    <corners android:radius="5dp" />
</shape>
Run Code Online (Sandbox Code Playgroud)

这是应用阴影的推荐方法,请查看https://developer.android.com/training/material/shadows-clipping.html#Shadows


小智 6

像这样创建背景可绘制以显示圆形阴影。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Drop Shadow Stack -->
    <item>
        <shape>
            <corners android:radius="4dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#00CCCCCC" />
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="4dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#10CCCCCC" />
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="4dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#20d5d5d5" />
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="6dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#30cbcbcb" />
        </shape>
    </item>
    <item>
        <shape>
            <corners android:radius="4dp" />
            <padding android:bottom="1dp" android:left="1dp"
                     android:right="1dp"  android:top="1dp" />
            <solid android:color="#50bababa" />
        </shape>
    </item>

    <!-- Background -->
    <item>
        <shape>
            <solid android:color="@color/gray_100" />
            <corners android:radius="4dp" />
        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)


小智 6

这个问题可能已经很老了,但对于未来任何想要一种简单方法来实现复杂阴影效果的人来说,请查看我的库 https://github.com/BluRe-CN/ComplexView

使用该库,您可以更改阴影颜色、调整边缘等等。这是实现您所寻求的目标的示例。

<com.blure.complexview.ComplexView
        android:layout_width="400dp"
        android:layout_height="600dp"
        app:radius="10dp"
        app:shadow="true"
        app:shadowSpread="2">

        <com.blure.complexview.ComplexView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:color="#fdfcfc"
            app:radius="10dp" />
    </com.blure.complexview.ComplexView>
Run Code Online (Sandbox Code Playgroud)

要更改阴影颜色,请使用 app:shadowColor="your color code"。