阴影处理

据我所知,现在阴影有两种主流处理方式

一:通过绘制

即http://blog.csdn.net/sjf0115/article/details/7363958效果所示

public   void   setShadowLayer (float radius, float dx, float dy, int color)

radius:阴影半径

dx:X轴方向的偏移量

dy:Y轴方向的偏移量

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>

设置后的效果图如下


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值