J'ai deux points dans la toile, maintenant je suis en mesure de tracer une ligne entre ces points comme ceci ci-dessous image en utilisant
Ce code canvas.drawLine(p1.x, p1.y, p2.x, p2.y, Paint);
Je veux dessiner l'arc entre deux points comme l'image ci-dessous.
Comment puis-je dessiner comme ça.
Enfin, j'ai obtenu 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
signifie l'angle entre deux lignes. Nous devons calculer cela en utilisant deux points, comme les points bleus dans 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 d'un peu différent et tout est basé sur le calcul du balayage et des angles de départ.
Je voulais montrer un arc qui représente les progrès sur un cercle qui va de haut en bas.
Donc, j'avais 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 que j'utilise:
int sweepAngle = (int) (360 * (getProgress() / 100.f));
Suivant est de calculer le startAngle
int startAngle = 270 - sweepAngle / 2;
L'angle de départ est calculé de cette façon parce que:
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 aille 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(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;
}
Une solution simple a été suggérée ici par Langkiller. Ceci trace une ligne cubique du point de départ au point final via le point de contrôle.
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)