Android利用 Canvas和shader阴影绘制

Posted by Kosmos on October 14, 2018
  • 自定义SeekBar
  • Android利用 canvas和Shader阴影绘制
  • 源码下载:Github码云
  • Github太慢,所以只在码云上持续更新

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

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); 
  //...........其他省略..............
}