首页 > 解决方案 > 画布中弧线的阴影

问题描述

我正在尝试为我的个人项目开发一个小的自定义视图。关于如何为我创建的视图提供高程效果或阴影效果,我遇到了一个小麻烦。

它是一个左右边缘有凹半圆的矩形。我能够为整个矩形提供阴影,但不能为凹半圆提供阴影,这是我的问题。

这是我目前拥有的图像,如果我们查看左右半圆,我们可以看到它们没有高程。

以下是相同的代码 -

private void init(AttributeSet set) {

    rect = new RectF();

    this.setLayerType(LAYER_TYPE_SOFTWARE, paint);

    paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setShadowLayer(8f, 4f, 4f, Color.rgb(197, 197, 197));

    eraser = new Paint(Paint.ANTI_ALIAS_FLAG);
    eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

    dashLine = new Paint(Paint.ANTI_ALIAS_FLAG);
    dashLine.setColor(Color.BLACK);
    dashLine.setStyle(Paint.Style.STROKE);
    dashLine.setStrokeWidth(1);
    dashLine.setPathEffect(new DashPathEffect(new float[]{10, 10}, 0));

    path = new Path();
}

@Override
protected void onDraw(Canvas canvas) {

    rect.left = RECT_PADDING;
    rect.top = RECT_PADDING;
    rect.right = getWidth() - RECT_PADDING;
    rect.bottom = getHeight() - RECT_PADDING;

    paint.setColor(Color.WHITE);

    //Canvas draws rectangle
    canvas.drawRoundRect(rect, 20, 20, paint);

    //Canvas draws scallop on left and right edges of rectangle
    canvas.drawCircle(RECT_PADDING, rect.bottom / 2, 20, eraser);
    canvas.drawCircle(rect.right, rect.bottom / 2, 20, eraser);

    //Dashed line between both the scallops
    path.moveTo(RECT_PADDING + 40, rect.bottom / 2);
    path.lineTo(rect.right - 40, rect.bottom / 2);
    canvas.drawPath(path, dashLine);


}

我知道会发生这种情况,因为eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));清除了进入其区域的所有内容,包括矩形的一部分及其阴影。

如何解决此问题或有其他选择吗?

提前致谢。

标签: javaandroidandroid-viewandroid-canvasandroid-custom-view

解决方案


一种方法是您可以将整个形状创建为矢量可绘制对象。这样,您需要定义的只是矢量可绘制对象和阴影,这里讨论了这个主题

创建带有阴影的矢量可绘制对象以覆盖图像


推荐阅读