Android利用 canvas和Shader阴影绘制

发布于 2018-10-14  170 次阅读


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

赤夜染尽 千樱散落 零时夜雨 无茵之音