Ответ 1
странно, что никто не отвечал на ответ, как только я нашел его (его было нелегко найти), это было действительно прямо.
Итак, как это работает: Предполагая, что вы хотите нарисовать закругленный угол в 12 - 3 (с использованием тактовой частоты): вы начинаете свой путь, и когда вам нужна строка для дуги, вы определяете прямоугольник, верхний левый угол которого - это место, где ваша линия в настоящее время завершена, а нижний правый угол - это место, куда вы хотите, чтобы дуга проходила, поэтому, если вы представляете квадрат, X, Y - 12 (на часах), а X + W, Y + H - 3, который вам нужен.
Теперь представьте, что у вас есть овал в этом квадрате (в этом примере это круговой овал, если вы хотите, чтобы ваша кривая была более овальной, затем определите квадрат как прямоугольник), вы можете взять любой кусочек этот круг, используя последние два параметра метода. Первый параметр определяет угол, в котором вы хотите начать резку. Если мы используем компас, 0 градусов - это Восток (не знаю, почему, я не эксперт по геометрии... это нормально? Я всегда думаю, что 0 - северный, но все примеры геометрии программирования, которые я вижу, равны 0 Восток, может быть, кто-то будет комментировать, почему это так).
Второй параметр определяет размер круга, который вы хотите. Если вы хотите, чтобы весь круг вы наложили 360, если вы хотите, чтобы половина круга вы положили 180 и т.д.
Итак, в нашем случае, поскольку мы хотим округлить угол от 12 до 3, мы ставим 270 в качестве начальной степени и получаем 90 градусов круга.
Наконец, когда вы закончите этот процесс, линия теперь думает о себе как о 3pm, чтобы вы могли продолжить 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);
}