2011-03-18 12 views
6

Estoy trabajando en mi primera aplicación de Android "real", un editor de flujo de trabajo gráfico. El dibujo se realiza en una clase personalizada, que es una subclase de Vista. En el momento en que mis elementos son rectángulos, que se dibujan en un lienzo. Para detectar acciones en los elementos comparo las coordenadas y verifico los elementos en la ubicación táctil.zoom centrado en vista personalizada - cálculo de coordenadas de lienzo

para implementar un gesto de zoom Probé http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

Con la canvas.scale 4 argumento (...) La función de zoom centrada funciona bien, pero yo no pierda la capacidad de calcular el lienzo coordenadas mediante el desplazamiento con mPosX y mPosY para detectar si el toque después de un zoom está en un elemento.

He intentado cambiar el ejemplo de la entrada de blog anterior para centrar el lienzo sobre el gesto de zoom con:

canvas.save(); 
canvas.translate(mPosX, mPosY); 
canvas.scale(mScaleFactor, mScaleFactor, mScalePivotX, mScalePivotY); 
//drawing .... 
canvas.restore(); 

No he encontrado ningún ejemplo de cómo esto podría hacerse sin perder el offset de referencia para calcular las coordenadas ¿Hay una solución fácil? Intenté calcular el desplazamiento con el centro de gestos y el factor de escala, pero fallé:/

He visto que otros ejemplos que usan un ImageView a menudo usan una matriz para transformar la imagen. ¿Podría hacerse esto con una vista personalizada y un lienzo? En caso afirmativo, ¿cómo puedo obtener el desplazamiento xey para verificar las coordenadas?

Además, si mis ideas son completamente erróneas, me gustaría ver algunos ejemplos sobre cómo se hace correctamente.

Thx! ;)

+0

hola, estoy enfrentando el problema de centrar el zoom. actualmente, cuando hago zoom, va al punto (0,0) y estoy usando este método canvas.scale (scaleFactor, scaleFactor) ;. ¿Cómo calculas ScalePivotX y scalePivotY? Gracias – sajjoo

Respuesta

3

Quizás el siguiente código le ayude a calcular las coordenadas con el centro de gestos y el factor de escala. Uso este método en mi clase representando opengl-sprite.

void zoom(float scale, PointF midPoint) { 
    if (zoomFactor == MAX_ZOOM_FACTOR && scale > 1) return; 
    if (zoomFactor == MIN_ZOOM_FACTOR && scale < 1) return; 

    zoomFactor *= scale; 
    x = (x - midPoint.x) * scale + midPoint.x; 
    y = (y - height + midPoint.y) * scale + height - midPoint.y; 
    if (zoomFactor >= MAX_ZOOM_FACTOR) { 
     zoomFactor = MAX_ZOOM_FACTOR; 
    } else if (zoomFactor < MIN_ZOOM_FACTOR) { 
     zoomFactor = MIN_ZOOM_FACTOR; 
     x = 0; 
     y = 0; 
    } 
} 

coordenadas X e Y son procesados ​​de diferentes maneras, a causa de la distinción entre las direcciones de OpenGL sistema de coordenadas (derecha y arriba) y sistema de coordenadas del punto medio (derecha y abajo). midPoint está tomado de las coordenadas MotionEvent s.

Todas las demás operaciones son comprensibles, creo.

Espero que te ayude.

+0

lo siento, me olvidé por completo de esta pregunta. Al final, se me ocurrió algo muy similar, pero ya no tengo el código para actualizar mi pregunta con mi solución. Gracias – m4tt

Cuestiones relacionadas