2011-04-07 61 views
16

我想绘制一个带圆角的矩形。我有一个JavaScript路径,这样做,但JavaScript的arcTo方法需要一个矩形(来定义它的椭圆形),然后一个参数设置扫描。有人可以解释arcTo的最后两个参数吗?

但是,在Android版本中有三个参数。矩形椭圆形(我认为我已经正确定义了),然后是startAngle和sweepAngle(我不了解它的用法),但是我的弧形看起来不像我期待的那样,猜猜他们应该工作。

有没有人知道这个好教程?

具体而言,我试图理解如果我试图从12 - 3绘制一个弧(在时钟面上),然后假设我有一条从3然后需要从3到6等转角。

这里是我的代码(忽略弧数字在那里,现在......这只是我的猜测,在这可能如何,由于无法对前面的,更明智的尝试最新的迭代):

Path ctx = new Path(); 
     ctx.moveTo(X+5,Y); //A 
     ctx.lineTo(X+W-5,Y);//B 
     ctx.arcTo(new RectF(X+W, Y, X+W, Y+5), -180, 90); //B arc 

     ctx.lineTo(X+W,Y+H-5); //C 
     ctx.arcTo(new RectF(X+W,Y+H,X+W-5,Y+H),90,180); //C arc 

     ctx.lineTo(X+W/2 +6,Y+H); 
     ctx.lineTo(X+W/2,Y+H+8); 
     ctx.lineTo(X+W/2-6,Y+H); 
     ctx.lineTo(X+5,Y+H); 
     ctx.arcTo(new RectF(X,Y+H,X,Y+H-5),180,270); 

     ctx.lineTo(X,Y+5); 
     ctx.arcTo(new RectF(X,Y,X+5,Y),270,0); 
     Paint p = new Paint(); 
     p.setColor(0xffff00ff); 

     canvas.drawPath(ctx, p); 

多谢。

回答

25

奇怪的是,没有一个管道中有一个答案,一旦我找到了它(这不容易找到),它是非常简单的。

所以,它的工作方式是这样的: 假设你想在12画一个圆角 - 3(使用时钟参考): 你开始你的路径,当你需要行电弧你定义一个矩形,其左上角是你的线当前被终止的地方,右下角是你想要弧去的地方,所以如果你想象一个X,Y是12(在时钟上)并且其X + W,Y + H是3这就是你需要的平方。

现在,想象你在那个正方形中有一个椭圆形(在这个例子中它是一个圆形的椭圆形,如果你希望曲线更加椭圆形,那么将你的正方形定义为一个矩形)使用该方法的最后两个参数。第一个参数定义了你想要开始切割的角度。如果我们使用罗盘,0度是东(不知道为什么,我不是一个几何专家......这是正常的吗?我总是认为0是北,但我看到的所有编程几何示例都有0东,也许有人会评论这是为什么)。

第二个参数定义了多少你想要的圆。如果你想把整个圆圈放到360,如果你想放一半的圆圈放180等等。

所以,在我们的例子中,因为我们想要从12拐弯到3,所以我们把270作为起点和抓取圆圈90度。

最后,当你完成这个过程时,这条线现在认为自己是在下午3点,所以你可以从那里继续lineTo(ing)。 所以...这里是我的形状的固定代码(它有一个小三角形,但它既不在这里也不在那里,实际的圆形部分是B-C,D-E,I-J和K-A,其余都是直线。

int arc = 25; 
    public Cursor(int X, int Y, int W, int H){ 
     /* 
     * A   B 
     * K    C 
     * J    D 
     * I H F E 
        G 
     */ 
     int Ax = X+ arc; 
     int Ay = Y; 
     int Bx = X + W - arc; 
     int By = Y; 
     int Cx = X + W; 
     int Cy = Y + arc; 
     int Dx = Cx; 
     int Dy = (Y + arc) + (H - arc*2); 
     int Ex = Bx; 
     int Ey = Y + H; 
     int Fx = X+W/2 +6; 
     int Fy = Ey; 
     int Gx = X+W/2; 
     int Gy = Y+H+8; 
     int Hx = X+W/2-6; 
     int Hy = Ey; 
     int Ix = Ax; 
     int Iy = Hy; 
     int Jx = X; 
     int Jy = Dy; 
     int Kx = X; 
     int Ky = Cy; 


     Path ctx = new Path(); 
     ctx.moveTo(Ax,Ay); //A 
     ctx.lineTo(Bx,By);//B 
     ctx.arcTo(new RectF(Bx, By, Cx, Cy), 270, 90); //B-C arc 

     ctx.lineTo(Dx,Dy); //D 
     ctx.arcTo(new RectF(Dx - arc, Dy, Ex + arc, Ey),0,90); //D-E arc 

     ctx.lineTo(Fx, Fy); //E-F 
     ctx.lineTo(Gx, Gy); //F-G 
     ctx.lineTo(Hx, Hy); //G-H 
     ctx.lineTo(Ix, Iy); //H - I 
     ctx.arcTo(new RectF(Jx, Jy, Ix, Iy),90,90);// I = J arc 

     ctx.lineTo(Kx, Ky); //K 
     ctx.arcTo(new RectF(Ax - arc, Ay, Kx + arc, Ky),180,90); //K - A arc 
     ctx.lineTo(Ax, Ay); //K 



     Paint p = new Paint(); 
     p.setAntiAlias(true); 
     p.setColor(0xffffffff); 
     p.setStyle(Style.FILL); 
     canvas.drawPath(ctx, p);  
     p.setColor(0xff000000); 
     p.setStyle(Style.STROKE); 
     p.setStrokeWidth(3);    
     canvas.drawPath(ctx, p); 



    } 
+0

嘿,我在绘制弧线的时候遇到了问题,我试着按照你的建议,但我无法得到它..你能看到我问的问题吗?在那里,我有我的问题详细,所以你最好理解。 http://stackoverflow.com/questions/17449339/how-to-define-te-startangle-and-sweepangle-for-arcto-method-android谢谢! :) – 2013-07-03 13:46:17

+1

想象你的弧被一个矩形包围(并且一直延伸到该矩形的内部,即使只显示你想要显示的部分)。第一个参数是椭圆内点的起点位置,第二个参数是要抓取完整椭圆的度数,以弧线为弧段。 – 2013-07-03 17:18:29

+0

谢谢!我知道我做错了什么。我将最终度数值传递给sweepAngle参数。考虑到startAngle参数,我不得不通过多少度数来抓取,正如我所说的那样,而不是finalAngle – 2013-07-03 18:01:10

0

下面是一些示例代码(从我班的一个拼凑起来的),以绘制填充,圆角矩形,然后添加描边矩形给它一个边界:

//Initializing some stuff 
_paint = new Paint(); 
_rect = new RectF(); 
_radius = 10; 
_bgColor = 0xFFFFFFFF; 
_borderColor = 0xFFCCCCCC; 

//Doing dimension calculations 
_rect.left = 0; 
_rect.top = 0; 
_rect.right = this.getWidth() - 1; 
_rect.bottom = this.getHeight() - 1; 

//painting 
//draw the background 
_paint.setColor(_bgColor); 
_paint.setStyle(Style.FILL_AND_STROKE); 
canvas.drawRoundRect(_rect, _radius, _radius, _paint); 

//draw the border 
_paint.setStrokeWidth(1); 
_paint.setColor(_borderColor); 
_paint.setStyle(Style.STROKE); 
canvas.drawRoundRect(_rect, _radius, _radius, _paint); 
+0

我很欣赏这一点,但这不是我所追求的...我想了解arcTo方法d。我的形状并非严格地说是一个矩形,它的底部有一个小箭头。 – 2011-04-07 22:32:22

2

感谢这个例子,它使参数非常清楚的理解。 从我在Android的开发文档中读到的内容中,您可能会省去一些“lineTo()”调用(除了那些指向F,G,H的调用),因为arcTo在弧的第一个点时自动添加一个lineTo是不是最后一点绘制...

至于为什么0开始东,这是因为数学和三角学的经验教训通常假设0度标记是三角圆(中心为0,0和半径1)与X轴相交,这是东(这些相同的经验教训通常计算逆时针角度,所以90度变为北,270为南,而在Android上,角度似乎是顺时针计数)

+0

感谢您的额外信息! – 2011-06-29 18:38:44

相关问题