¿Cómo dibujar el arco entre dos puntos en el canvas?

Tengo dos puntos en el canvas, ahora puedo trazar una línea entre esos puntos como esta imagen debajo usando

Este código canvas.drawLine(p1.x, p1.y, p2.x, p2.y, paint); enter image description here

Quiero dibujar el arco entre dos puntos como la imagen de abajo.

enter image description here

¿Cómo puedo dibujar así?

    Finalmente obtuve la solución de este código:

     float radius = 20; final RectF oval = new RectF(); oval.set(point1.x - radius, point1.y - radius, point1.x + radius, point1.y+ radius); Path myPath = new Path(); myPath.arcTo(oval, startAngle, -(float) sweepAngle, true); 

    Para calcular startAngle , use este código:

     int startAngle = (int) (180 / Math.PI * Math.atan2(point.y - point1.y, point.x - point1.x)); 

    Aquí, point1 significa dónde quieres comenzar a dibujar el Arc. sweepAngle significa el ángulo entre dos líneas. Tenemos que calcular eso usando dos puntos como los puntos azules en mi imagen de Pregunta.

    Haz algo como esto:

     @Override protected void onDraw(Canvas canvas) { Paint p = new Paint(); RectF rectF = new RectF(50, 20, 100, 80); p.setColor(Color.BLACK); canvas.drawArc (rectF, 90, 45, true, p); } 

    Estaba tratando de hacer algo un poco diferente y se trata de calcular el barrido y comenzar angularjs.

    Quería mostrar un arco que representa el progreso en un círculo que va de arriba a abajo.

    Así que tuve un valor de progreso de 0 … 100 y quiero mostrar un arco que comience de arriba a abajo para llenar el círculo cuando el progreso es 100.

    Para calcular el sweepAngle utilizo:

      int sweepAngle = (int) (360 * (getProgress() / 100.f)); 

    Lo siguiente es calcular el inicio

      int startAngle = 270 - sweepAngle / 2; 

    El ángulo de inicio se calcula de esta manera porque:

    1. Siempre va a comenzar desde el lado izquierdo, comenzando desde arriba hacia abajo. El ángulo de inicio en la parte superior es igual a 270 (tenga en cuenta que va en el sentido de las agujas del reloj y 0 = 3 en punto, por lo que las 12 en punto equivalen a 270 grados)
    2. Luego quiero calcular cuánto voy a alejarme de mi punto de partida (270) y para hacerlo solo calculo la mitad del ángulo de barrido porque solo la mitad del arco estará en el lado izquierdo y la otra mitad en el lado izquierdo. el lado correcto.

    Entonces, teniendo en cuenta que tengo un progreso del 25%

     sweepAngle = 90 degrees (90 degrees is quarter of a circle) start angle = 225 (45 degrees away from 270) 

    Si desea que el progreso vaya desde otros lados (de izquierda a derecha, de derecha a izquierda, etc.) solo necesitará reemplazar 270 con el inicio del ángulo.

    una muestra para dibujar el arco.

     public static Bitmap clipRoundedCorner(Bitmap bitmap, float r, boolean tr, boolean tl, boolean bl, boolean br) { int W = bitmap.getWidth(); int H = bitmap.getHeight(); if (r < 0) r = 0; int smallLeg = W; if(H < W ) smallLeg = H; if (r > smallLeg) r = smallLeg / 2; float lineStop = r/2; Path path = new Path(); path.moveTo(0,0); if(tr) { path.moveTo(0, lineStop); path.arcTo(new RectF(0,0, r,r), 180, 90, false); } path.lineTo(W-lineStop, 0); if(tl) path.arcTo(new RectF(Wr,0, W,r), 270, 90, false); else path.lineTo(W, 0); path.lineTo(W, H-lineStop); if(bl) path.arcTo(new RectF(Wr,Hr, W,H), 0, 90, false); else path.lineTo(W, H); path.lineTo(lineStop, H); if(br) path.arcTo(new RectF(0,Hr, r,H), 90, 90, false); else path.lineTo(0,H); if(tr) path.lineTo(0,lineStop); else path.lineTo(0,0); Bitmap output = Bitmap.createBitmap(W, H, Config.ARGB_8888); Canvas canvas = new Canvas(output); final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLACK); canvas.drawPath(path, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, 0, 0, paint); return output; } 

    Una solución simple fue sugerida aquí por Langkiller. Esto dibuja una línea cúbica desde el punto de inicio a través del punto de control hasta el punto final.

     Path path = new Path(); float startX = 0; float startY = 2; float controlX = 2; float controlY = 4; float endX = 4 float endY = 2 conePath.cubicTo(startX, startY, controlX, controlY,endX, endY); Paint paint = new Paint(); paint.setARGB(200, 62, 90, 177); paint.setStyle(Paint.Style.FILL); canvas.drawPath(path, paint)