gpt4 book ai didi

java - Canvas 中弧线的阴影

转载 作者:行者123 更新时间:2023-12-01 16:21:58 26 4
gpt4 key购买 nike

我正在尝试为我的个人项目开发一个小型自定义 View 。我面临着一个小麻烦,如何为我创建的 View 提供高程效果或投影效果。

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

这是我当前拥有的图像,如果我们观察左右半圆,我们可以看到它们没有海拔。

下面是相同的代码 -

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));清除进入其区域的所有内容,包括矩形的一部分及其阴影。

如何解决这个问题或者有其他替代方案吗?

提前致谢。

最佳答案

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

Create Vector Drawable with Drop Shadow to Overlay an Image

关于java - Canvas 中弧线的阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62246394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com