Saltar al contenido

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

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:

  1. 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)
  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *