android shape实现阴影或模糊边效果

android实现阴影的方式有很多,

1.   Android 在 API21(5.0)添加了 elevation,可以很方便的在 View 上实现阴影。但是这个只在 >= API21 的手机上可以看到阴影效果,低于这个版本的就没有阴影效果。

2.  CardView 也可以实现阴影效果,项目中一般都是使用这种方式实现卡片式的效果并带有阴影。使用 CardView 确实很不错,但是它在使用的时候也是需要有注意的地方:

(1) CardView 实现阴影效果的布局,在 >= API 21 的版本上和 < 21 的版本上,如果不在代码上做好控制,他们的显示差异还是很大的。(2) CardView 在 >= API21 的版本上实现阴影效果也是通过 elevation 来实现的,最终的渲染是调用 native 方法进行的。在使用过程中发现在不同位置的 View 阴影的方向是不一样的。不知道你们发现没,它模拟的场景就是 光源的位置在屏幕中心的正上方,然后 View 的位置由光源的位置决定。阴影方向不一致。

3. 通过 .9 图来制作阴影,这里通过一个很好的工具来制作哈:http://inloop.github.io/shadow4android/,这种方式制作小的背景阴影很模糊,效果上比不过 shape。

4. 用 SCardView 来实现阴影,使用方式和 CardView一样,但是它是使用一套代码,显示不会有差异,而且可以通过设置光源的位置来控制阴影的方向以及阴影的颜色。

compile 'io.github.meetsl:SCardView:1.0'

5. 通过shape来实现,具体是通过layer-list 多层叠放的方式实现的。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 3     <!-- 边 -->
 4     <item>
 5         <shape android:shape="rectangle">
 6             <padding
 7                 android:bottom="2dp"
 8                 android:left="2dp"
 9                 android:right="2dp"
10                 android:top="2dp" />
11             <solid android:color="#00CCCCCC" />
12             <corners android:radius="8dp" />
13         </shape>
14     </item>
15     <item>
16         <shape android:shape="rectangle">
17             <padding
18                 android:bottom="2dp"
19                 android:left="2dp"
20                 android:right="2dp"
21                 android:top="2dp" />
22             <solid android:color="#10CCCCCC" />
23             <corners android:radius="8dp" />
24         </shape>
25     </item>
26     <item>
27         <shape android:shape="rectangle">
28             <padding
29                 android:bottom="2dp"
30                 android:left="2dp"
31                 android:right="2dp"
32                 android:top="2dp" />
33             <solid android:color="#20CCCCCC" />
34             <corners android:radius="8dp" />
35         </shape>
36     </item>
37     <item>
38         <shape android:shape="rectangle">
39             <padding
40                 android:bottom="2dp"
41                 android:left="2dp"
42                 android:right="2dp"
43                 android:top="2dp" />
44             <solid android:color="#30CCCCCC" />
45             <corners android:radius="8dp" />
46         </shape>
47     </item>
48     <item>
49         <shape android:shape="rectangle">
50             <padding
51                 android:bottom="2dp"
52                 android:left="2dp"
53                 android:right="2dp"
54                 android:top="2dp" />
55             <solid android:color="#50CCCCCC" />
56             <corners android:radius="8dp" />
57         </shape>
58     </item>
59 
60     <!-- 中心背景 -->
61     <item>
62         <shape android:shape="rectangle"
63             android:useLevel="false">
64             <!-- 实心 -->
65             <solid android:color="#ffffff" />
66             <corners android:radius="10dp" />
67             <padding android:left="10dp"
68                 android:right="10dp"
69                 android:top="10dp"
70                 android:bottom="10dp"/>
71         </shape>
72     </item>
73 </layer-list>

使用

1 android:background="@drawable/layer_white_bg"


各种方式的差异
方式是否有显示差异是否可以控制阴影方向是否可以设置阴影颜色阴影是否占位是否模糊绘制效率其他
elevation不可控制不可设置不占位高,通过 native 绘制只在 API 21 生效
CardView不可控制不可设置不占位Api 21 上效率高,通过native 绘制 
shape可控可设置占位一般 
.9 图可控,生效一次,更改需重新生成 可设置,更改需重新生成占位模糊慢(加载图片显示) 
SCardView可控可设置不占位一般 
 

 

转载于:https://www.cnblogs.com/linghu-java/p/10837421.html