据我所知,现在阴影有两种主流处理方式
一:通过绘制
即http://blog.csdn.net/sjf0115/article/details/7363958效果所示
public void setShadowLayer (float radius, float dx, float dy, int color)
注意:如果半径被设置为0,意思就是去掉阴影。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
setLayerType(LAYER_TYPE_SOFTWARE, null);
Paint shadowPaint=new Paint();
// public void setShadowLayer(float radius, float dx, float dy, int shadowColor)
shadowPaint.setColor(Color.BLUE);
shadowPaint.setShadowLayer(30, 0, 15, Color.BLUE);
// public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry,@NonNull Paint paint) {
if(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP) {
canvas.drawRoundRect(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), getMeasuredHeight()/2, getMeasuredHeight()/2, shadowPaint);
}else{
canvas.drawRect(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), shadowPaint);
}
}
重写控件发现无法显示,如果没有我绘制的圆角矩形的高度,阴影是无法显示
1.不设置颜色 shadowPaint.setColor(Color.BLUE);设置阴影颜色无效
2.不显示主体高度,即如上代码所示,没有任何阴影显示
因此我只需要在原有的button上绘制一个带圆角的阴影失败,用此方法暂时不行,阴影也不带圆角,就是个长方形的
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
setLayerType(LAYER_TYPE_SOFTWARE, null);
Paint shadowPaint=new Paint();
// public void setShadowLayer(float radius, float dx, float dy, int shadowColor)
shadowPaint.setColor(Color.BLUE);
shadowPaint.setShadowLayer(30, 0, 15, Color.BLUE);
// public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry,@NonNull Paint paint) {
if(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP) {
canvas.drawRoundRect(0, getMeasuredHeight()-50, getMeasuredWidth(), getMeasuredHeight()-20, getMeasuredHeight()/2, getMeasuredHeight()/2, shadowPaint);
}else{
canvas.drawRect(0, getMeasuredHeight()-50, getMeasuredWidth(), getMeasuredHeight()-20, shadowPaint);
}
}
执行上面显示效果如下:
二:使用shape叠加多层
在自定义shape中增加一层或多层,并错开,即可显示阴影效果。为增加立体感,按钮按下的时候,只设置一层。我们可以通过top, bottom, right 和 left 四个参数来控制阴影的方向和大小
//自定义两种阴影效果
第一种
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<?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=
"#ff58bb52"
/>
<corners android:radius=
"30dip"
/>
</shape>
</item>
</layer-list>
</item>
<item>
<layer-list>
<!-- 第一层 -->
<item android:left=
"4dp"
android:top=
"4dp"
>
<shape>
<solid android:color=
"#66000000"
/>
<corners android:radius=
"30dip"
/>
<!-- 描边 -->
<stroke android:width=
"1dp"
android:color=
"#ffffffff"
/>
</shape>
</item>
<!-- 第二层 -->
<item android:bottom=
"4dp"
android:right=
"4dp"
>
<shape>
<solid android:color=
"#ff58bb52"
/>
<corners android:radius=
"30dip"
/>
<!-- 描边 -->
<stroke android:width=
"1dp"
android:color=
"#ffffffff"
/>
</shape>
</item>
</layer-list>
</item>
</selector>
|
第二种
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<?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=
"#ff58bb52"
/>
<corners android:radius=
"3dp"
/>
</shape>
</item>
</layer-list>
</item>
<!-- 正常状态 -->
<item>
<layer-list>
<!-- 第一层 -->
<item android:left=
"2dp"
android:top=
"2dp"
>
<shape>
<solid android:color=
"#66000000"
/>
<corners android:radius=
"3dp"
/>
</shape>
</item>
<!-- 第二层 -->
<item android:bottom=
"4dp"
android:right=
"4dp"
>
<shape>
<solid android:color=
"#ff58bb52"
/>
<corners android:radius=
"3dp"
/>
</shape>
</item>
<!-- 第三层 -->
<item android:bottom=
"6dp"
android:right=
"6dp"
>
<shape>
<solid android:color=
"#ffcccccc"
/>
<corners android:radius=
"3dp"
/>
</shape>
</item>
</layer-list>
</item>
</selector>
|
设置后的效果图如下