java - 画布中弧线的阴影
问题描述
我正在尝试为我的个人项目开发一个小的自定义视图。关于如何为我创建的视图提供高程效果或阴影效果,我遇到了一个小麻烦。
它是一个左右边缘有凹半圆的矩形。我能够为整个矩形提供阴影,但不能为凹半圆提供阴影,这是我的问题。
这是我目前拥有的图像,如果我们查看左右半圆,我们可以看到它们没有高程。
以下是相同的代码 -
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));
清除了进入其区域的所有内容,包括矩形的一部分及其阴影。
如何解决此问题或有其他选择吗?
提前致谢。
解决方案
一种方法是您可以将整个形状创建为矢量可绘制对象。这样,您需要定义的只是矢量可绘制对象和阴影,这里讨论了这个主题
推荐阅读
- windows - 从控制面板获取用户首选语言列表的正确方法是什么?
- flutter - AWS Amplify,初始化失败
- c# - 从服务中读取本地安全策略
- go - 为什么 Go Programming 将任何以零开头的数字视为八进制,我该如何防止这种情况发生?
- rust - 如何在赋值时解决“预期结构,找到类型参数”?
- flutter - 将对象转换为可编码对象失败:'_CompactLinkedHashSet 的实例
- >'
- entity-framework - EntityTypeConfiguration 中没有忽略属性?
- git - 如何对支持不同依赖版本的多个发布分支进行版本控制?
- reactjs - 无法匹配 Firebase 中的用户
- apache - 如何在 OpenShift Online Pro 中禁用路由的 tls 1.0 和 1.1