在Android中绘制具有锐角的心
下面的问题听起来可能有点愚蠢,但我想愚蠢是没有限度的,所以就这样吧。我在Android中使用画布绘制心脏,在绘制心脏时没有任何问题,但我无法在汇点使心脏锋利。我的心看起来像 代码:在Android中绘制具有锐角的心,android,android-canvas,Android,Android Canvas,下面的问题听起来可能有点愚蠢,但我想愚蠢是没有限度的,所以就这样吧。我在Android中使用画布绘制心脏,在绘制心脏时没有任何问题,但我无法在汇点使心脏锋利。我的心看起来像 代码: left_x_moveto = 200; left_y_moveto = 45; left_x1 = 197; left_y1 = -35; left_x2 = 60; l
left_x_moveto = 200;
left_y_moveto = 45;
left_x1 = 197;
left_y1 = -35;
left_x2 = 60;
left_y2 = 20;
left_x3 = 193;
left_y3 = 130;
right_x_moveto = 200;
right_y_moveto = 45;
right_x1 = 197;
right_y1 = -35;
right_x2 = 345;
right_y2 = 20;
right_x3 = 193;
right_y3 = 130;
heart_outline_paint.setColor(getResources().getColor(R.color.heart_outline_color)); // Change the boundary color
heart_outline_paint.setStrokeWidth(15);
heart_outline_paint.setStyle(Paint.Style.STROKE);
path.moveTo(left_x_moveto, left_y_moveto);
path.cubicTo(left_x1, left_y1, left_x2, left_y2, left_x3, left_y3);
path.moveTo(right_x_moveto, right_y_moveto);
path.cubicTo(right_x1, right_y1, right_x2, right_y2, right_x3, right_y3);
canvas.drawPath(path, heart_outline_paint);
到目前为止我尝试了什么:
left_x_moveto = 200;
left_y_moveto = 45;
left_x1 = 197;
left_y1 = -35;
left_x2 = 60;
left_y2 = 20;
left_x3 = 193;
left_y3 = 130;
right_x_moveto = 200;
right_y_moveto = 45;
right_x1 = 197;
right_y1 = -35;
right_x2 = 345;
right_y2 = 20;
right_x3 = 193;
right_y3 = 130;
heart_outline_paint.setColor(getResources().getColor(R.color.heart_outline_color)); // Change the boundary color
heart_outline_paint.setStrokeWidth(15);
heart_outline_paint.setStyle(Paint.Style.STROKE);
path.moveTo(left_x_moveto, left_y_moveto);
path.cubicTo(left_x1, left_y1, left_x2, left_y2, left_x3, left_y3);
path.moveTo(right_x_moveto, right_y_moveto);
path.cubicTo(right_x1, right_y1, right_x2, right_y2, right_x3, right_y3);
canvas.drawPath(path, heart_outline_paint);
left_x_moveto
,left_y_moveto
的点数,反之亦然,但心脏完全变形,我找不到原因李>
当right\u x\u moveto=198
和right\u y\u moveto=45
时,心脏看起来像
我不知道为什么会这样
心脏的宽度\u轮廓\u油漆
可以满足我的要求,但我希望心脏的厚度相同,因此减小设置行程宽度
不是一个选项任何帮助都将不胜感激。提前谢谢 现在的情况是,线的厚度是在一侧绘制的,而不是在两侧绘制的。以真正的MS绘画风格: (左边是正在发生的事情,右边是你想要的。黑色是线条的实际位置,宽度为1px,红色是“填充”,第二、第三到第十五个像素,
heart\u outline\u paint.setStrokeWidth(15);
)
若要解决此问题,请尝试从右行的x减去该行宽度的一半,然后将其添加到左行的x。这样做可以解决此问题,而不是修复它您需要执行一些操作
path.Close()
关闭路径heart\u outline\u paint.setStrokeJoin(paint.join.MITER)设置笔划连接代码>
路径
只有在连续绘制时才能关闭。因此,我修改了代码,以便可以正确地执行path.close()
。下面是代码。protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
heart_outline_paint = new Paint(Paint.ANTI_ALIAS_FLAG);
heart_outline_paint.setStrokeJoin(Paint.Join.MITER);
path = new Path();
int left_x_moveto = 200;
int left_y_moveto = 45;
int left_x1 = 180;
int left_y1 = -20;
int left_x2 = 30;
int left_y2 = 20;
int left_x3 = 193;
int left_y3 = 130;
int right_x_moveto = 200;
int right_y_moveto = 45;
int right_x1 = 214;
int right_y1 = -20;
int right_x2 = 375;
int right_y2 = 20;
int right_x3 = 193;
int right_y3 = 130;
heart_outline_paint.setColor(Color.RED); // Change the boundary color
heart_outline_paint.setStrokeWidth(15);
heart_outline_paint.setStyle(Paint.Style.STROKE);
path.moveTo(left_x_moveto, left_y_moveto);
path.cubicTo(left_x1, left_y1, left_x2, left_y2, left_x3, left_y3);
path.cubicTo(right_x2, right_y2, right_x1, right_y1, right_x_moveto, right_y_moveto);
path.close();
canvas.drawPath(path, heart_outline_paint);
}
Paint.Join.MITER
就是你想要的
连接的外边缘以锐角相交
现在,这种斜接只有在角度为时才起作用。您尝试使用了吗?否,在哪里关闭它?在drawPath之后?在drawPath之后尝试过,但没有用。不管怎样,谢谢你的建议。好吧,这是一个关于画红心的页面(不同的技术):我以前看过这个链接,但它对我没有多大帮助,它有更多的计算,我遵循的方法非常简单,只需要点..通过说“线的宽度”,你是说我需要用我用来画心脏的点做点什么?是的。我的意思是,在这种情况下,
right\ux3
应该变成right\ux3-(15/2)
(15因为heart\u outline\u paint.setStrokeWidth(15);
)和left\ux3
应该变成left\ux3+(15/2)
。如前所述,这是一种解决方法,而不是修复方法。好吧,那么我把你的代码弄错了,然后你应该减去并加上(15/2)
。虽然从我看来,这也可能不会产生正确的结果,但您可能必须将路径分为两条路径。是的,我已经按照您的建议尝试了,但没有任何用处。所以你是说,如果我使用两条不同的路径,那么我就能实现它?我不确定,但可能值得一试。例如,左半部分使用一条路径,右半部分使用另一条路径。如果这不起作用,你可以尝试将其分为底部和顶部,顶部从侧面的两条线完全垂直的位置开始。谢谢你的努力,这意味着很多!!我会根据需要改变积分,但你肯定做得很好。。脱帽致敬,伙计。我已经使用了lineTo
和arcTo
,用MITTER
连接按预期工作来绘制心形。为了简单起见,我将所有内容都放在了onDraw
方法中。您应该将路径
和绘制
创建移动到构造函数。注意了,感谢您的建议。非常好!谢谢你!有人上来了吗!。当用户的手指远离第一次触摸时,心脏的大小应该增加,当接近第一次触摸时,心脏的大小应该减少。就像radius一样,我用矩形和圆形来做这件事,它们工作得很好,但我不能让心脏走这条路,心脏必须在我触摸第一个手指的地方画,我发现心脏画的大部分代码都在屏幕的右上角,请帮助。