studio - manual de programacion android
¿Cómo dibujar el arco entre dos puntos en el lienzo? (4)
Tengo dos puntos en el lienzo, 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);
Quiero dibujar el arco entre dos puntos como la imagen de abajo.
¿Cómo puedo dibujar así?
Estaba tratando de hacer algo un poco diferente y se trata de calcular el barrido y comenzar ángulos.
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:
- 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)
- 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.
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);
}
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(W-r,0, W,r), 270, 90, false);
else
path.lineTo(W, 0);
path.lineTo(W, H-lineStop);
if(bl)
path.arcTo(new RectF(W-r,H-r, W,H), 0, 90, false);
else
path.lineTo(W, H);
path.lineTo(lineStop, H);
if(br)
path.arcTo(new RectF(0,H-r, 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;
}