2011-07-20 14 views
10

Estoy trabajando en una vista personalizada (extends View) y trabajando en el método onDraw.dibujar la ruta rotada en el punto particular

he hecho un camino de una flecha:

ARROW_PATH = new Path(); 
    ARROW_PATH.setLastPoint(20, 37); 
    ARROW_PATH.lineTo(14, 25); 
    ARROW_PATH.lineTo(18, 26); 
    ARROW_PATH.lineTo(17, 4); 
    ARROW_PATH.lineTo(23, 4); 
    ARROW_PATH.lineTo(22, 26); 
    ARROW_PATH.lineTo(26, 25); 
    ARROW_PATH.close(); 

en diferentes escenarios que necesita para ser girada para representar un cierto ángulo, y tengo que dibujar en una en particular de coordenadas en la vista. La coordenada también cambia según el escenario.

He intentado jugar con Canvas.rotate sin embargo, parece que el aspecto de la vía está sesgada cuando los px y py valores no son iguales (la flecha se hace más estrecho y más alto cuando py > px.

también tengo Canvas.rotate(angle, 0, 0); tratado y luego ARROW_PATH.moveTo(x, y); pero parece que las coordenadas son girados por el ángulo arbitrario por lo que es muy difícil de calcular el requerido. coordinar

Idealmente, me gustaría hacer girar el camino y no el lienzo, pero no lo hago Creo que esta operación es compatible con la API.

¿Alguien puede sugerir un mejor enfoque para este problema?

gracias, p.

Respuesta

9

Encontré una manera de hacerlo funcionar.

En primer lugar he modificado mi Path de modo que se centró

ARROW_PATH = new Path(); 
ARROW_PATH.setLastPoint(0, 17); 
ARROW_PATH.lineTo(-6, 5); 
ARROW_PATH.lineTo(-2, 6); 
ARROW_PATH.lineTo(-3, -16); 
ARROW_PATH.lineTo(3, -16); 
ARROW_PATH.lineTo(2, 6); 
ARROW_PATH.lineTo(6, 5); 
ARROW_PATH.close(); 

y luego una llamada extra para traducir ayuda a localizar el dibujo:

canvas.save(); 
canvas.rotate(angle, x, y); 
canvas.save(); 
canvas.translate(x, y); 
canvas.drawPath(ARROW_PATH, paint); 
canvas.restore(); 
canvas.restore(); 
+0

¿Por qué se ahorra? el estado dos veces? Parece redundante. –

+0

pruébelo sin hacer la doble restauración/doble restauración ... no funciona. si tiene una mejor solución (que ha probado), publíquela. – pstanton

23

Ésta es una forma adecuada para rotar de forma permanente un camino (se mantendrá así hasta la próxima aplicación de una matriz):

Matrix mMatrix = new Matrix(); 
RectF bounds = new RectF(); 
mPath.computeBounds(bounds, true); 
mMatrix.postRotate(myAngle, bounds.centerX(), bounds.centerY()); 
mPath.transform(mMatrix); 
+0

Ayuda, la forma en que la pregunta solicita rotar una instancia de Path en el lienzo de Android alrededor de su centro. – Master

+0

Thnaks hombre me salvó el día! No puedo usar _canvas.rotate (mRotation, mWidth/2, mHeight/2); _ porque estoy usando LayerDrawable –

Cuestiones relacionadas