Android利用 canvas和Shader阴影绘制

本文详细介绍了在Android中使用canvas和Shader实现自定义SeekBar阴影效果的方法。通过调整阴影半径、坐标偏移和颜色,实现了拖动和静止状态下的不同阴影效果。文章还分享了解决硬件加速问题的经验,确保阴影效果正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


效果图:
在这里插入图片描述

1.关于Thumb的阴影效果的关键的代码
mPaint.setColor(mThumbColor);
if (isThumbOnDragging) {
    //绘制拖动中的Thumb
    //绘制拖动中的阴影:阴影半径,阴影x坐标偏移,阴影y坐标偏移,阴影颜色
    mPaint.setShadowLayer(5f, 0, 3, Color.GRAY);
    canvas.drawCircle(mThumbCenterX, yTop, mThumbRadiusOnDragging, mPaint);
} else {
     //绘制静止状态Thumb
     //绘制静止状态阴影:阴影半径,阴影x坐标偏移,阴影y坐标偏移,阴影颜色
     mPaint.setShadowLayer(5f, 0, 1, Color.GRAY);
     canvas.drawCircle(mThumbCenterX, yTop, mThumbRadius, mPaint);
}
mPaint.setShadowLayer(0, 0, 0, Color.GRAY);//关闭阴影

我尝试过用,paint.setShader(mShader);的方式,但已经过时,谷狗不推荐

2.setShadowLayer的注意事项

1.用完之后记得关掉阴影效果,因为这是作为一个参数,传入Paint里面,最简单的做法就是直接把阴影半径设为0,即可

3.这里我踩了一个坑,记录下,以免再犯

开始我一切写好后,却一直没有阴影效果,折腾了好久,才发现是硬件加速的问题。
setShadowLayer只有文字绘制才支持硬件加速,其他都不支持
因此,要为此控件单独关闭硬件加速:setLayerType(LAYER_TYPE_SOFTWARE, null);

 @Override
protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  //对单独的View在运行时阶段禁用硬件加速
  setLayerType(LAYER_TYPE_SOFTWARE, null); 
  //...........其他省略..............
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值