Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿alguien puede explicar los últimos dos parámetros de arcTo?

Estoy tratando de dibujar un rectángulo con esquinas redondeadas. Tengo una ruta de JavaScript que hace esto, pero el método javascript arcTo toma un rectángulo (para definir su oval) y luego un parámetro que establece el barrido.

Sin embargo, en la versión de Android hay tres params. el rectángulo oval (que creo que he definido correctamente) y luego el startAngle y sweepAngle (que no estoy entendiendo el uso de), pero mis arcos no se parecen a lo que estoy esperando cuando me fideos con la forma en que supongo que deberían funcionar.

¿Alguien sabe de un buen tutorial sobre esto?

Específicamente estoy tratando de entender lo que los dos params parecen si estaba tratando de dibujar un arco (en una cara del reloj) de 12 a 3, y luego suponiendo que tenía una línea que corría desde el 3 y luego se necesita para a la vuelta de la esquina de 3 a 6 y así sucesivamente.

Aquí está mi código (desprecie los números de arco ahí ahora … eso es sólo la última iteración de mi adivinación de cómo esto puede funcionar, habiendo fallado en los anteriores, los intentos más sensatos):

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); 

Muy agradecido.

3 Solutions collect form web for “¿alguien puede explicar los últimos dos parámetros de arcTo?”

extraño que nadie entró con una respuesta, una vez que lo encontré (no era fácil de encontrar) que era realmente sencillo.

Por lo tanto, la forma en que funciona es la siguiente: Supongamos que desea dibujar una esquina redondeada en 12-3 (usando la referencia de reloj): inicia su ruta y cuando necesita la línea de arco que define un rectángulo cuya esquina superior izquierda es el lugar donde su línea está actualmente terminada y cuya esquina inferior derecha es el lugar al que desea ir, así que si imagina un cuadrado cuya X, Y es 12 (en el reloj) y cuya X + W, Y + H es 3 que es la plaza que necesita.

Ahora, imagina que tienes un óvalo en ese cuadrado (en este ejemplo es un óvalo circular, si quieres que tu curva sea más ovalada, entonces define tu cuadrado como un rectángulo), puedes tomar cualquier porción de ese círculo usando los dos últimos params del método. El primer parámetro define el ángulo en el que desea comenzar a cortar. Si estamos usando una brújula, 0 grados es East (no estoy seguro de por qué, no soy un experto en geometría … ¿es esto normal? Siempre pienso en 0 siendo North, pero todos los ejemplos de geometría de programación que veo tienen 0 como Este, tal vez alguien comentará por qué eso es).

El segundo parámetro define la cantidad de círculo que desea. Si quieres que todo el círculo que poner 360 si quieres la mitad del círculo que poner 180 etc

Por lo tanto, en nuestro caso ya que queremos redondear la esquina de 12 a 3, ponemos 270 como nuestro grado de inicio y agarrar 90 grados del círculo.

Por último, cuando haya terminado con este proceso, la línea ahora piensa en sí mismo como a las 3 pm para que pueda continuar lineTo (ing) desde allí. Así que … aquí está mi código fijo para mi forma (tiene un pequeño triángulo en él, pero eso no es ni aquí ni allí, las partes redondeadas reales son BC, DE, IJ y KA. Todo el resto son rectas.

 int arc = 25; public Cursor(int X, int Y, int W, int H){ /* * AB * KC * JD * IHFE 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); //BC arc ctx.lineTo(Dx,Dy); //D ctx.arcTo(new RectF(Dx - arc, Dy, Ex + arc, Ey),0,90); //DE arc ctx.lineTo(Fx, Fy); //EF ctx.lineTo(Gx, Gy); //FG ctx.lineTo(Hx, Hy); //GH 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); } 

Gracias por este ejemplo, hace que los parámetros sean muy claros de entender. De lo que leo en los documentos de desarrollo de Android probablemente puede ahorrarse algunas de las llamadas "lineTo ()" (excepto las de los puntos F, G, H), ya que arcTo agrega automáticamente una lineTo cuando el primer punto del arco es no el último punto dibujado …

En cuanto a por qué 0 comienza en el Este, es así debido a las clases de matemáticas y trigonometría generalmente asumen que la marca de 0 grados es el punto donde el círculo trigonométrico (círculo con el centro 0,0 y el radio 1) cruza con el eje X, que es Este (sin embargo, generalmente estas mismas lecciones cuentan los ángulos en sentido contrario a las agujas del reloj, por lo que 90 grados se convierte en el norte y 270 en el sur, mientras que en Android parece que los ángulos se cuentan en sentido horario)

He aquí un ejemplo de código (juntado de una de mis clases) para dibujar un rectángulo lleno, redondeado de la esquina y después agregar un rectángulo acariciado para darle un borde:

 //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); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.