OnScale y Canvas – ¿cómo ajustar el punto de origen después de ampliar la imagen?

Tengo una aplicación de prueba muy simple con un componente personalizado MyView.java – que muestra una imagen desplazable y escalable (que representa un tablero en un juego de palabras similar a Scrabble):

Nexus captura de pantalla

1) En mi oyente de la escala yo ajusta el factor de escala:

public boolean onScale(ScaleGestureDetector detector) { mScale *= detector.getScaleFactor(); // XXX how to adjust mOffsetX and mOffsetY ? XXX constrainZoom(); constrainOffsets(); invalidate(); return true; } 

2) Y luego en el método de dibujo de mi componente personalizado aplico la traducción y el factor de escala:

 protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.translate(mOffsetX, mOffsetY); canvas.scale(mScale, mScale); gameBoard.setBounds( 0, 0, gameBoard.getIntrinsicWidth(), gameBoard.getIntrinsicHeight() ); gameBoard.draw(canvas); } 

Por desgracia, parece que hay un pequeño error al escalar con gesto de pellizco –

Puedo ver, que la escala y los límites son de tamaño correcto después de hacer zoom, pero el desplazamiento de la imagen no es.

El problema empeora, cuando el punto de enfoque del gesto de pellizco está lejos de 0, 0 punto de la pantalla.

Es un poco difícil describir el problema en palabras, pero cuando revisas mi proyecto de prueba de GitHub lo verás inmediatamente (y siempre puedes tocar dos veces para restablecer el offset y la escala).

Este es probablemente un problema común con una forma estándar de resolverlo, pero no he sido capaz de encontrarlo todavía.

La imagen del tablero es CC BY-SA por Denelson83 y el código se basa en el How-to support the fling gesture con un blog de efecto rebote .

Estás moviendo el lienzo dos veces: primero con translate , luego con scale(sx,sy,px,py); .

Usted podría combinar sus enfoques a sus compensaciones en su onScale y luego usar la scale(sx,sy) .

  • Android VideoView cómo escalar como tipo de escala ImageView fitXY?
  • Cómo obtener una animación inversa de ActivityOptions.makeScaleUpAnimation al terminar la actividad de los niños en android?
  • Animación de escala de imagen de Android relativa al punto central
  • ¿Por qué mi escala vectorial no es como se espera?
  • ¿Qué pasa con setScaleX / setScaleY?
  • Escalado de vista de superficie OpenGL para diferentes DPI
  • Zoom en un lienzo utilizando la función canvas.scale?
  • SetPivotX funciona extraño en la vista escalada
  • Escala automática TextView Text para ajustar dentro de límites
  • Android ViewPropertyAnimator no se escala al mismo tiempo
  • Android ViewPager Con animación diferente como acercar, atenuarse, etc
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.