在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

下面的问题听起来可能有点愚蠢,但我想愚蠢是没有限度的,所以就这样吧。我在Android中使用画布绘制心脏,在绘制心脏时没有任何问题,但我无法在汇点使心脏锋利。我的心看起来像

代码:

            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一样,我用矩形和圆形来做这件事,它们工作得很好,但我不能让心脏走这条路,心脏必须在我触摸第一个手指的地方画,我发现心脏画的大部分代码都在屏幕的右上角,请帮助。