在画布绘制的形状周围创建阴影?

时间:2013-08-07 09:19:33

标签: android canvas shape shadow

创建形状需要哪些步骤,例如使用Canvas从头开始使用阴影的矩形?

在用于绘制矩形的绘画中添加阴影图层没有成功。

3 个答案:

答案 0 :(得分:34)

不需要Bitmap,只需将图层类型设置为LAYER_TYPE_SOFTWARE原始方法即可。

public class TestShapeShadow extends View
{
    Paint paint;

    public TestShapeShadow(Context context)
    {
       super(context);  

        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setShadowLayer(12, 0, 0, Color.YELLOW);

        // Important for certain APIs 
        setLayerType(LAYER_TYPE_SOFTWARE, paint);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {   
        canvas.drawRect(20, 20, 100, 100, paint);
    }
}

答案 1 :(得分:6)

  1. 创建。路径,添加一些元素

  2. 将BlurMaskFilter设置为Paint

  3. 使用dx,dy阴影偏移

  4. 绘制路径
  5. 取消设置遮罩过滤器

  6. 再次绘制路径,没有。偏移

答案 2 :(得分:2)

我遵循了上面@pskink的想法,并找到了解决方案。 我将代码段放在这里供有需要的人使用。

如果您想知道什么是阴影属性,可以参考此测试器: https://okawa-h.github.io/box-shadow_tester/

public class MyViewWithShadow extends View {

    Paint paint;
    int mainColor;
    int shadowColor;

    // shadow properties
    int offsetX = -25;
    int offsetY = 30;
    int blurRadius = 5;

    public MyViewWithShadow(Context context)
    {
        super(context);

        mainColor = Color.RED;
        shadowColor = Color.BLACK; // this color can also have alpha

        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {   
        // Create paint for shadow
        paint.setColor(shadowColor);
        paint.setMaskFilter(new BlurMaskFilter(
            blurRadius /* shadowRadius */,
            BlurMaskFilter.Blur.NORMAL));

        // Draw shadow before drawing object
        canvas.drawRect(20 + offsetX, 20 + offsetY, 100 + offsetX, 100 + offsetY, paint);

        // Create paint for main object
        paint.setColor(mainColor);
        paint.setMaskFilter(null);

        // Draw main object 
        canvas.drawRect(20, 20, 100, 100, paint);
    }
}