Comment dessiner Arc entre deux points sur le canevas?

J’ai deux points dans le canevas, maintenant je peux tracer une ligne entre ces points comme celui ci-dessous en utilisant

Ce code canvas.drawLine(p1.x, p1.y, p2.x, p2.y, paint); entrer la description de l'image ici

Je veux dessiner l’arc entre deux points comme ci-dessous l’image.

entrer la description de l'image ici

Comment puis-je dessiner comme ça?

Enfin, j’ai la solution de ce code:

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

Pour calculer startAngle , utilisez ce code:

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

Ici, point1 signifie où vous voulez commencer à dessiner l’arc. sweepAngle désigne l’angle entre deux lignes. Nous devons calculer cela en utilisant deux points comme les points bleus de mon image Question.

Faites quelque chose comme ça:

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

J’essayais de faire quelque chose de différent et il s’agissait de calculer les angles de balayage et de départ.

Je voulais montrer un arc qui représente le progrès sur un cercle qui va de haut en bas.

J’ai donc eu une valeur de progression de 0 à 100 et je veux montrer un arc qui commence de haut en bas pour remplir le cercle lorsque la progression est de 100.

Pour calculer l’angle de balayage, j’utilise:

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

Suivant est de calculer le startAngle

  int startAngle = 270 - sweepAngle / 2; 

Angle de départ est calculé de cette façon car:

  1. Cela va toujours partir du côté gauche, de haut en bas. Donc, l’angle de départ en haut est égal à 270 (notez qu’il va dans le sens des aiguilles d’une montre et 0 = 3 heures, donc 12 heures est égal à 270 degrés)
  2. Ensuite, je veux calculer à quelle distance je vais m’éloigner de mon sharepoint départ (270) et pour ce faire, je ne calcule que la moitié de l’angle de balayage car seule la moitié de l’arc sera sur le côté gauche et l’autre moitié sur Le côté droit.

Donc, considérant que j’ai des progrès de 25%

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

Si vous voulez que la progression passe des autres côtés (de gauche à droite, de droite à gauche, etc.), il vous suffira de remplacer 270 par l’angle de départ.

un échantillon pour dessiner un arc.

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

Une solution simple a été proposée ici par Langkiller. Cela dessine une ligne cubique du sharepoint départ via le sharepoint contrôle au sharepoint fin.

 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)