如何在canvas上的两点之间绘制弧?
我有两个点在canvas上,现在我可以通过使用下面的图像之间的这些点之间画一条线
这个代码canvas.drawLine(p1.x, p1.y, p2.x, p2.y, paint);
我想绘制像下面的图像两点之间的弧。
我怎么画这个
最后,我从这个代码得到了解决scheme:
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);
要计算startAngle
,请使用以下代码:
int startAngle = (int) (180 / Math.PI * Math.atan2(point.y - point1.y, point.x - point1.x));
这里, point1
表示你想要开始绘制弧的地方。 sweepAngle
表示两条线之间的angular度。 我们必须通过使用两个点,像我的问题图像中的蓝色点来计算。
做这样的事情:
@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); }
我试图做一些有点不同的事情,这是关于计算扫描和开始的angular度。
我想展示一个代表进步的弧线,从上到下循环。
所以我有0 … 100的进度值,我想显示一个从上到下的圆弧,当进度为100时,填充圆圈。
要计算我使用的sweepAngle:
int sweepAngle = (int) (360 * (getProgress() / 100.f));
接下来是计算startAngle
int startAngle = 270 - sweepAngle / 2;
起始angular度是这样计算的,因为:
- 它总是从左侧开始,从上到下。 所以顶部的起始angular度等于270(注意顺时针旋转,0 = 3点,所以12点钟等于270度)
- 接下来,我想计算一下我将从我的出发点(270)离开多远,并且这样做,我只计算一半的扫描angular度,因为只有一半的弧线将在左侧,另一半在右边。
所以考虑到我有25%
sweepAngle = 90 degrees (90 degrees is quarter of a circle) start angle = 225 (45 degrees away from 270)
如果你想从其他方面进展(从左到右,从右到左等),你只需要用开始的angular度来replace270。
绘制弧的样本。
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; }