2011-09-27 8 views
5

Sé que hay toneladas de hilos en realidad para obtener el zoom pellizco implementado, pero ya he llegado hasta aquí.Enfoque en android: mantener la imagen a la vista

Estoy usando SimpleScaleGestureListener para manejar el pellizco. Me las he arreglado para asegurarme de que no se puede alejar más que para mantener la altura de la imagen igual al tamaño de la pantalla (para que la altura de la imagen siempre sea al menos la altura del tamaño de pantalla disponible).

Sin embargo, estoy buscando una manera de detectar automáticamente si la imagen se está panoramizando fuera de estos límites. Al igual que la forma estándar de Android para mostrar la imagen. Por lo tanto, si amplío, y desplazo la imagen hacia arriba, y luego la alejé, quiero que detecte cuando la parte inferior de la imagen llegue al final de la pantalla, y luego el "pivote" del zoom se ajusta en consecuencia, nunca permitiendo " espacios en blanco "arriba o debajo de la imagen misma. ¿Alguien puede ayudarme?

Para referencia, aquí es mi onScale y métodos OnDraw:

public boolean onScale(ScaleGestureDetector detector){ 
    float minScale = (float) ((float) SCREEN_SIZE.y/(float) DRAWABLE_SIZE.y); 
    mScaleFactor *= detector.getScaleFactor(); 
    mScaleFactor = Math.max(minScale, Math.min(mScaleFactor, 5.0f)); 
    invalidate(); 
    return true; 
} 

protected void onDraw(Canvas canvas) { 
    canvas.save(); 
    canvas.drawColor(Color.DKGRAY); 
    canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor, getDrawable().getIntrinsicWidth()/2, 
    getDrawable().getIntrinsicHeight()/2); 

    this.getDrawable().draw(canvas); 
    canvas.restore(); 
} 

Respuesta

3

Se puede utilizar para transformar android.graphics.Matrix mapa de bits dibujado . Matrix tiene escala y traducción en él.

Se podría aplicar simplemente la matriz de lienzo: canvas.setMatrix

Puede calcular fácilmente Ajustar en pantalla durante rectángulo deseada:

Matrix.setRectToRect 

donde origen es de la imagen (de mapa de bits) venta rectángulo de resolución con 0,0 en la izquierda/arriba y ancho/alto en la parte inferior derecha. dst es el rectángulo de la vista de destino donde se dibujará Bitmap.

Luego, también puede resolver su tarea: para saber dónde se dibujarán los bordes de su imagen. Matrix.mapRect calculará dónde aparecerá el rectángulo de su Bitmap (como se discutió anteriormente) en la pantalla en las coordenadas de la pantalla. Entonces puede simplemente donde se dibuja el lado izquierdo de la imagen en relación con el lado izquierdo de la pantalla, lo mismo para arriba/derecha/abajo.

No le voy a dar el código, solo le indica qué camino tomar. Recientemente codifiqué visor de imágenes con pellizco-zoom, ajuste-a-pantalla, transiciones animadas, etc., y todo fue hecho usando Matrix y manipulaciones de eso.

+0

¡Gracias! Buscaré en la matriz. Agradezco que no desee compartir el código, pero ¿tiene un enlace a buenos recursos en la matriz y cómo superar mi problema específico? Tal vez un buen tutorial? Por supuesto, voy a googlearme a mí mismo, pero si tuvieras alguna sugerencia de primera categoría, estaría muy agradecido :) – Dynde

+0

No sé sobre un enlace en particular. Sin embargo, trate de buscar la transformación 2D, la matriz matemática, etc. No es demasiado difícil, y Matrix es muy potente en gráficos. En el lienzo de Android es solo una matriz 2D. –

+0

@mice hola, ¿me puede enviar el código de este problema en particular con la matriz. Quiero usar el zoom y la panorámica en Canvas.Pero no puedo hacer Panning ... lo hice en google pero usando Matrix no puedo encontrar nada. Gracias por adelantado. – anddev

2

Una solución simple es utilizar este widget

http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/

+2

Las soluciones simples pueden ser geniales :) Sin embargo, estoy más que interesado en aprender cómo abordar este problema, y ​​luego simplemente usar otro código, aunque podría ser útil como inspiración :) – Dynde

+0

El código se extrae de la aplicación de galería predeterminada y Hace mucho tiempo que trabajé en él, lo máximo que recuerdo es que tiene una matriz predeterminada para la imagen y luego, al alejarse/en su mapeo cambiado matriz – ingsaurabh

+0

Buen enlace, con código de proyecto completo incluido. –

Cuestiones relacionadas