2012-06-21 32 views
37

Ho due punti nella tela, ora sono in grado di tracciare una linea tra questi punti come questa immagine di seguito utilizzandoCome disegnare un arco tra due punti sulla tela?

Questo codice canvas.drawLine(p1.x, p1.y, p2.x, p2.y, paint); enter image description here

voglio disegnare l'arco tra due punti come sotto l'immagine.

enter image description here

Come posso disegnare come questo.

+0

http://stackoverflow.com/questions/4196749/draw-arc-with-2-points-and-center-of-the-circle – vajapravin

+0

@vajapravin ho provato, ma tali funzioni non sono disponibili per canvas in Android .. –

+0

abbiamo questa funzione in android: drawArc (RectF, float, float, boolean, Paint); –

risposta

43

Finalmente ho avuto la soluzione da questo codice:

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); 

Per calcolare startAngle, utilizzare questo codice:

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

Qui, point1 significa dove vuoi iniziare a disegnare l'arco. sweepAngle significa l'angolo tra due linee. Dobbiamo calcolarlo usando due punti come i punti blu nella mia immagine di domanda.

+4

Che cosa significa sweeep_angle? –

+0

Qui sweep_angle significa l'angolo tra due linee, dobbiamo calcolare che usando due punti quelli sono i punti più corti tra l'angolo (punto i like) come i punti blu nella mia immagine domanda ... –

+0

OK, grazie !! :) –

17

fare qualcosa di simile:

@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); 
} 
+0

devo disegnare l'arco tra questi due punti solo –

+0

Poi tu è necessario fornire l'angolo iniziale e l'angolo di scansione, vedere [documenti qui] (http://developer.android.com/reference/android/graphics/Canvas.html) –

+0

l'angolo tra i punti cambierà dinamicamente e la posizione di anche questi punti .. –

3

Stavo cercando di fare qualcosa di leggermente diverso e si tratta solo di calcolare gli angoli di sweep e start.

Volevo mostrare un arco che rappresenta il progresso su un cerchio che va dall'alto verso il basso.

così ho avuto il valore di avanzamento da 0 ... 100 e voglio mostrare un arco che inizia dall'alto verso il basso per riempire il cerchio quando il progresso è 100.

Per calcolare lo sweepAngle che uso:

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

successivo è quello di calcolare lo startAngle

int startAngle = 270 - sweepAngle/2; 

Angolo iniziale viene calcolato in questo modo perché:

01.235.164,106174 millions
  1. Parte sempre dal lato sinistro, iniziando dall'alto verso il basso. Quindi l'angolo iniziale in alto equivale a 270 (Si noti che va in senso orario e 0 = 3 in punto, quindi 12 in punto uguale a 270 gradi)
  2. Avanti Voglio calcolare quanto lontano vado lontano dal mio punto di partenza (270) e per fare ciò calcolo solo metà dell'angolo di sweep perché solo metà dell'arco sarà sul lato sinistro e l'altra metà sul lato destro.

Quindi, considerando che ho progresso del 25%

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

Se si desidera che il progresso di andare da altre parti (Da sinistra a destra, da destra a sinistra, ecc ..) si avrà solo bisogno di sostituire 270 con l'avvio dell'angolo.

0

un campione per l'arco di trazione.

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; 
} 
Problemi correlati