Android Zoomable / desplazable ImageView con superposiciones

Me gustaría mostrar una imagen (incluida la funcionalidad de desplazamiento y zoom). Además, necesito agregar algunas superposiciones a la imagen dinámicamente. Las superposiciones están en relación con el contenido de la imagen.

  • Si el usuario se desplaza, las superposiciones deben moverse también
  • Si el usuario zooms, las superposiciones no deben ser ampliadas, sino mantener su posición relativa a la imagen

En otras palabras: Me gustaría implementar un mapa con algunos marcadores, pero proporciono mi propio material de mapa.

Mi pregunta principal es: ¿Cómo podría hacer esto?

Lo que he intentado hasta ahora

  • Intenté implementarlo dentro de un WebView, ya que proporcionó la funcionalidad básica de zoom y escalado. Sin embargo, no tuve éxito en la adición de superposiciones sin utilizar Javascript y HTML (lo que pensé que no era una manera muy conveniente de resolver el problema)
  • Hay proyectos (es decir, TouchImageView ) que están implementando la funcionalidad de desplazamiento / zoom, pero hacen que sea aún más difícil agregar funcionalidad de superposición propia desde mi punto de vista.

Preguntas

¿Hay una solución o un acercamiento simple a mi problema?

¿Cuál es la forma correcta de agregar y mover vistas en tiempo de ejecución en Android? (Normalmente, usaría un diseño básico y jugaría con el margen – ¿sería la mejor práctica?)

¿Podría alguien que me apunte a la dirección correcta, por favor.

Min. Nivel del API: 10

Yo sugeriría extender la clase View y sobreescribir el método onDraw . Echa un vistazo a la API de lienzo .

Es probable que tenga un método onDraw que se vea como:

 @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.translate(mPosX, mPosY); //position of your actual data canvas.scale(mScaleFactor, mScaleFactor); // zoom factor map.draw(canvas); //you draw your map here canvas.restore(); //go back to saved state //for each marker you have, do the same "save - translate - scale - draw" loop } 

Puesto que usted no necesita sus marcadores para ser zoomable, usted no necesitará probablemente el paso de la escala pero usted necesita calcular su posición correctamente.

Dependiendo de su número de objetos, etc, puede que tenga que tener una forma más optimizada de dibujar sus marcadores (por ejemplo, volver a dibujar sólo áreas rectangulares cambiadas). Vea View.invalidate (Rect)

Creo que este puede ayudarte

Referir este proyecto Enlace

Tiene un desplazamiento automático de la imagen y el zoom de una imagen cuando haga clic en él.

¿Ha intentado subclasificar Ver y manejar los gestos de los usuarios? Es mi primera opción para comportamientos complejos como tales. Debe ser algo como esto:

  • En la clase extendiendo Vista, debe instanciar la imagen y superposiciones necesarias en el momento de la creación como objetos Bitmap
  • OnScroll calculará cómo la imagen y las superposiciones pueden ser después de tal desplazamiento, actualizar los mapas de bits e invalidar la vista actual
  • Mediante un GestureDetector, puede gestionar eventos de pellizco y tratar los eventos de zoom in / zoom out de la misma forma que los eventos de desplazamiento
  • Recuerde llamar siempre invalidate después de cambiar su Bitmaps
  • Dibujar los mapas de bits durante el método onDraw

Un montón de material sobre esta tareas individuales en StackOverflow, avíseme si necesita ayuda adittional en cualquiera de estos.

Compruebe este proyecto de ejemplo https://github.com/jzafrilla/AndroidImageHostpot

Después de mucho tiempo, encontré la respuesta exacta a mi solución: TileView

Configuración de la vista de mapa:

 @Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); TileView tileView = new TileView( this ); tileView.setSize( 2000, 3000 ); // the original size of the untiled image tileView.addDetailLevel( 1f, "tile-%d-%d.png"); setContentView( tileView ); } 

Agregar el marcador:

 tileView.addMarker( someView, 250, 500, -0.5f, -1.0f ); 

Código de la documentación.

  • Android WebView Scrollable
  • No se puede obtener backspace para trabajar en codemirror, bajo Phonegap en Android 4.x?
  • Hacer que la vista web de una tableta simule un pequeño dispositivo
  • La vista de Android Web no muestra contenido HTML cargado en algún teléfono específicamente htc una x
  • Bloqueo de vista web NullPointerException android.webkit.WebViewDatabase.initDatabase (WebViewDatabase.java:234)
  • Se bloquea el video HTML 5 al ir a pantalla completa
  • ¿Cómo enviar datos de un Fragmento a otro Fragmento?
  • Problema de CORS con Tomcat y Android Webview
  • Llame a la función Java desde JavaScript a través de Android WebView
  • Listview con webview
  • Manejo de teclado virtual de vista Web en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.