我正在尝试画一个圆角的矩形.我有一个javascript路径来执行此操作,但javascript arcTo方法采用矩形(以定义其椭圆),然后一个param设置扫描.
但是,在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);
Run Code Online (Sandbox Code Playgroud)
非常感谢.
Gen*_* S. 30
奇怪的是,一旦我找到答案,没有人用管道输入它(这不容易找到)它真的很直接.
因此,它的工作方式是这样的:假设你想在12 - 3处绘制一个圆角(使用时钟参考):你开始你的路径,当你需要弧线时你定义一个左上角是一个矩形的矩形您的线当前已经终止,其右下角是您希望弧线到达的位置,因此如果您想象一个X,Y为12(在时钟上)并且其X + W,Y + H为的正方形3这就是你需要的广场.
现在,假设你在那个方格中有一个椭圆形(在这个例子中它是一个圆形椭圆形,如果你想让你的曲线更椭圆形,然后将你的方形定义为一个矩形),你可以使用该圆形的任何切片该方法的最后两个参数.第一个参数定义了您想要开始切割的角度.如果我们使用指南针,0度是东方(不知道为什么,我不是几何专家......这是正常的吗?我总是认为0是北方,但我看到的所有编程几何示例都为0东,也许有人会评论为什么会这样).
第二个参数定义了你想要的圆圈数量.如果你想要整个圆圈,你可以放360.如果你想要放置一半圆圈180等
因此,在我们的情况下,因为我们想要从12到3的角落,我们将270作为我们的起始度并抓住90度的圆圈.
最后,当你完成这个过程时,线路现在认为自己是在下午3点,所以你可以从那里继续lineTo(ing).所以...这是我的形状的固定代码(它有一个小三角形,但它既不在这里也不存在,实际的圆形部分是BC,DE,IJ和KA.其余的都是直线.
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);
}
Run Code Online (Sandbox Code Playgroud)
该答案arcTo使用四个示例直观地解释了所有参数。
arcTo采用以下参数:
public void arcTo(RectF oval,
float startAngle,
float sweepAngle,
boolean forceMoveTo)
Run Code Online (Sandbox Code Playgroud)
其中RectF的构造函数采用:
RectF(float left, float top, float right, float bottom)
Run Code Online (Sandbox Code Playgroud)
(希望这种可视化比阅读官方文档少一些痛苦和神秘arcTo。)
| 归档时间: |
|
| 查看次数: |
5913 次 |
| 最近记录: |