2010-09-30 11 views
5

Quiero crear una forma de tipo globo de discurso, donde hay un rectángulo o elipse con una forma triangular que sobresale de él.Android: cómo combinar las rutas de dos formas y eliminar la superposición?

Cómo estoy tratando de hacer esto es crear un objeto Path que combine el triángulo con la otra forma (round rect).

lo estoy haciendo como sigue:

Path path = new Path(); 
// Create triangular segment 

Point drawOffset = getAttributes().getDrawOffset(); 
int leaderGap = getAttributes().getLeaderGapWidth(); 

// Recall that we have a coordinate system where (0,0) is the 
// bottom midpoint of the annotation rectangle. 

// the point to left of gap 
int x1 = -leaderGap/2; 
int y1 = 0; 

// the point to right of gap 
int x2 = leaderGap/2; 
int y2 = 0; 

// The point where we're drawing to; the end of the pointy segment of triangle 
int x3 = -drawOffset.x; 
int y3 = drawOffset.y; 

path.moveTo(x2, y2); 
path.lineTo(x3, y3); 
path.lineTo(x1, y1); 
// path.close(); 


// Add the rectangular portion to the path 
path.addRoundRect(backgroundShape, 5, 5, Path.Direction.CW); 

El problema es que el RoundRect es un camino cerrado, por lo que su borde se muestra a través debajo de la sección triangular.

vale más que mil palabras de una imagen, así que aquí vamos:

Rounded balloon

Lo que yo quiero es que el segmento de línea entre los dos puntos extremos del triángulo a desaparecer, por lo que se parezca a uno sin fisuras camino.

Si todo lo que estaba haciendo fuera un rectángulo recto, podría crear todo el camino desde cero. Pero me gustaría hacer las esquinas redondeadas, y sería un poco de pintura hacerlo con The Path (sí, sé que puedes hacer quad to y arcTo pero todavía no es una solución tan limpia como me gusta).

Entonces, en general, ¿es posible combinar dos caminos y crear un solo objeto de unión que trace el perímetro de ambos?

Respuesta

0

No veo una manera conveniente de combinar caminos de esta manera. Normalmente conseguiría esto dibujando manualmente las partes rectangulares redondeadas con Path.arcTo() y Path.lineTo(), es un poco de esfuerzo extra pero conseguirá el resultado que está buscando.

Otra opción que es quizás más flexible si decide cambiar el tema es usar un ninepatch drawable hay incluso un editor que le permita crear los llamaron Draw 9-patch

0

Si esto es posible a partir del API 19. Se pueden realizar operaciones lógicas entre 2 caminos. Como en su caso, puede crear una UNIÓN de las dos rutas, usando Path.op(). Para obtener una lista completa de las operaciones que se pueden realizar, consulte here.

Cuestiones relacionadas