Solución:
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);
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 desea comenzar a dibujar el Arco. 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:
//Initialized paint on a class level object.
Paint p = new Paint();
p.setColor(Color.BLACK);
//Calculate the rect / bounds of oval
RectF rectF = new RectF(50, 20, 100, 80);
@Override
protected void onDraw(Canvas canvas) {
//Do the drawing in onDraw() method of View.
canvas.drawArc (rectF, 90, 45, false, p);
}
Estaba tratando de hacer algo un poco diferente y se trata de calcular el barrido y los ángulos de inicio.
Quería mostrar un arco que representa el progreso en un círculo que va de arriba a abajo.
Así que tenía un valor de progreso de 0 … 100 y quiero mostrar un arco que comienza de arriba a abajo para llenar el círculo cuando el progreso es 100.
Para calcular el sweepAngle que uso:
int sweepAngle = (int) (360 * (getProgress() / 100.f));
Lo siguiente es calcular el ángulo de inicio
int startAngle = 270 - sweepAngle / 2;
El ángulo de inicio se calcula de esta manera porque:
- Siempre comenzará desde el lado izquierdo, comenzando desde arriba hacia abajo. Entonces, el ángulo inicial 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)
- A continuación, quiero calcular qué tan lejos me voy a alejar de mi punto de partida (270) y para hacer eso 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 correcto.
Entonces, considerando 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 tendrá que reemplazar 270 con el ángulo inicial.