用曲线绘制形状

Drawing a shape with a curve line

想画成这个图

因为那会像在 link ShapeDrawable Drawing multiple shapes with ShapeDrawable in xml with Android 中那样使用,但不知道如何制作直线曲线 - - - - - - - - - - -编辑 - - - - - - - - - - - - - - ------

基于@Bojan Kseneman 的回答尝试了以下代码

    PointF pt1l = new PointF(canvas.getWidth()/2+40, (float)newPosY-canvas.getWidth()/40);//canvas.getWidth()/40
    PointF pt2l = new PointF(canvas.getWidth()/2+40, (float)newPosY+canvas.getWidth()/40);
    PointF midl = new PointF(canvas.getWidth()/2+30, (float)newPosY+canvas.getWidth()/40);

    PointF pt1r = new PointF(canvas.getWidth()/2-40, (float)newPosY-canvas.getWidth()/40);
    PointF pt2r = new PointF(canvas.getWidth()/2-40, (float)newPosY+canvas.getWidth()/40);
    PointF midr = new PointF(canvas.getWidth()/2-30, (float)newPosY+(canvas.getWidth()/40)/2);

    Path pathLeft = new Path();
    //pathLeft.setFillType(Path.FillType.EVEN_ODD);
    pathLeft.moveTo(pt1l.x,pt1l.y);
    pathLeft.quadTo(midl.x,midl.y,pt2l.x,pt2l.y);

    Path pathRight = new Path();
    //pathRight.setFillType(Path.FillType.EVEN_ODD);
    pathRight.moveTo(pt1r.x,pt1r.y);
    pathRight.quadTo(midr.x,midr.y,pt2r.x,pt2r.y);
    Paint curveLineR = new Paint();
    curveLineR.setColor(Color.GREEN);

    Paint curveLineL = new Paint();
    curveLineL.setColor(Color.GREEN);

    Paint circle = new Paint();
    circle.setColor(Color.GREEN);

    canvas.drawPath(pathLeft, curveLineL);
    canvas.drawPath(pathRight, curveLineR);
    //canvas.drawCircle(canvas.getWidth()/2,canvas.getHeight()/2,canvas.getWidth()/30,circle);
    canvas.drawCircle(canvas.getWidth()/2,(float)newPosY,canvas.getWidth()/40,circle);

但没有得到更像圆的一部分的曲线(改变 midr 和 midl 的值变得更近但仍然不是一条线)。也许通过更多的测试可以获得这条线,但现在只需要圆圈,对于任何也试图让曲线离开代码的人来说,+1 用于@Bojan Kseneman 指向正确的方向。

您应该使用 Canvas 创建一个自定义视图并绘制类似的东西。您必须在中间绘制两条路径(两条曲线)和一个圆圈。这是基本思路,您将需要自己完成其余的工作。

protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 Path pathLeft = new Path();
 pathLeft.moveTo(x1, y1);
 pathLeft.quadTo(x1, y1, x2, y2);

 Path pathRight = new Path();
 pathLeft.moveTo(x1, y1);
 pathLeft.quadTo(x1, y1, x2, y2);

 canvas.drawPath(pathLeft, mPathPaint);
 canvas.drawPath(pathRight, mPathPaint);
 canvas.drawCircle(x, y, radius, paint); 
}