¿Existe una forma común de mostrar una imagen grande y permitir al usuario acercar y alejar y desplazar la imagen?
Hasta ahora encontré dos formas:
- sobrescribir ImageView, eso parece demasiado para un problema tan común.
- usando una vista web pero con menos control sobre el diseño general, etc.
Respuestas:
ACTUALIZAR
Acabo de darle a TouchImageView una nueva actualización. Ahora incluye Double Tap Zoom y Fling además de Panning y Pinch Zoom. El siguiente código está muy anticuado. Puede consultar el proyecto github para obtener el último código.
USO
Coloque TouchImageView.java en su proyecto. Luego se puede usar igual que ImageView. Ejemplo:
Si está utilizando TouchImageView en xml, debe proporcionar el nombre completo del paquete, ya que es una vista personalizada. Ejemplo:
Nota: Eliminé mi respuesta anterior, que incluía un código muy antiguo y ahora enlazo directamente al código más actualizado en github.
ViewPager
Si está interesado en colocar TouchImageView en un ViewPager, consulte esta respuesta.
fuente
TouchImageView(Context context, AttributeSet attrs)
y llamesuper(context, attrs);
Esto se debe a que cuando infla la vista personalizada, se construye con dos parámetros, en lugar de solo uno. Cuando llegue a eso, arreglaré TouchImageView para que sea compatible con los tres constructores de vista y elementos dibujables.<com.example.TouchImageView android:id="@+id/img" />
. ¿Hiciste eso?Adapte un código para crear un TouchImageView que sea compatible con multitouch (> 2.1). Está inspirado en el libro Hello, Android! (3a edición)
Está contenido en los siguientes 3 archivos TouchImageView.java WrapMotionEvent.java EclairMotionEvent.java
TouchImageView.java
WrapMotionEvent.java
EclairMotionEvent.java
fuente
WrapMotionEvent
yEclairMotionEvent
... de todos modos, +1.Utilicé un WebView y cargué la imagen desde la memoria a través de
WebView maneja todos los desplazamientos, zoom, desplazamiento. Si usa wrap_content, la vista web no será más grande que la imagen y no se muestran áreas blancas. El WebView es el mejor ImageView;)
fuente
En respuesta a la pregunta original de Janusz, hay varias formas de lograr esto, todas las cuales varían en su nivel de dificultad y se han indicado a continuación. Usar una vista web es bueno, pero es muy limitado en términos de apariencia y control. Si está dibujando un mapa de bits desde un lienzo, las soluciones más versátiles que se han propuesto parecen ser las de MikeOrtiz, Robert Foss y / o lo que sugirió Jacob Nordfalk. Hay un gran ejemplo para la incorporación de la android-multitouch-controlador por PaulBourke , y es ideal para contar con el apoyo multitouch y AllTypes de vistas personalizadas.
Personalmente, si simplemente está dibujando un lienzo en un mapa de bits y luego lo muestra en el interior y en ImageView y desea poder acercarse y moverse con el toque múltiple, la solución de MikeOrtiz es la más fácil. Sin embargo, para mis propósitos, el código del Git que ha proporcionado parece funcionar solo cuando su clase TouchViewView personalizada ImageView es el único elemento secundario o proporciona los parámetros de diseño como:
Desafortunadamente debido a mi diseño de diseño, necesitaba "wrap_content" para "layout_height". Cuando lo cambié a esto, la imagen se recortó en la parte inferior y no pude desplazarme ni acercarme a la región recortada. Así que eché un vistazo a Source for ImageView solo para ver cómo Android implementó "onMeasure" y cambié MikeOrtiz para adaptarlo.
Aquí resolveSize (int, int) es una "Utilidad para conciliar un tamaño deseado con restricciones impuestas por un MeasureSpec, donde:
Parámetros:
Devoluciones:
Por lo tanto, esencialmente proporciona un comportamiento un poco más similar a la clase ImageView original cuando se carga la imagen. Se podrían realizar algunos cambios más para admitir una mayor variedad de pantallas que modifiquen la relación de aspecto. Pero por ahora espero que esto ayude. Gracias a MikeOrtiz por su código original, gran trabajo.
fuente
También puedes probar http://code.google.com/p/android-multitouch-controller/
La biblioteca es realmente genial, aunque inicialmente un poco difícil de entender.
fuente
Acabo de integrar TouchImageView de Robert Foss: ¡funcionó perfectamente fuera de la caja! ¡Gracias!
Acabo de modificar un poco el código para poder crear una instancia desde mi layout.xml.
Solo agrega dos constructores
y transforma el viejo constructor en un método init:
fuente
@Robert Foss, @Mike Ortiz, muchas gracias por tu trabajo. Fusioné tu trabajo y completé las clases de Robert para Android> 2.0 con el trabajo adicional de Mike.
Como resultado de mi trabajo, presento Android Touch Gallery, basado en ViewPager y utilicé TouchImageView modificado. Las imágenes se cargan por URL y puede hacer zoom y arrastrarlas. Puede encontrarlo aquí https://github.com/Dreddik/AndroidTouchGallery
fuente
Intente usar
ZoomView
para ampliar cualquier otra vista.http://code.google.com/p/android-zoom-view/ ¡ es fácil, gratis y divertido de usar!
fuente
Agregando a la respuesta de @ Mike. También necesité tocar dos veces para restaurar la imagen a las dimensiones originales cuando la vi por primera vez. Así que agregué un montón completo de variables de instancia "orig ..." y agregué SimpleOnGestureListener que hizo el truco.
fuente
Esta es una adición muy tardía a este hilo, pero he estado trabajando en una vista de imagen que admite zoom y panorámica y tiene un par de características que no he encontrado en ningún otro lado. Esto comenzó como una forma de mostrar imágenes muy grandes sin causar
OutOfMemoryError
s, submuestreando la imagen cuando se aleja y cargando mosaicos de mayor resolución cuando se acerca. Ahora admite el uso en unaViewPager
rotación manual o el uso de información EXIF (paradas de 90 °), anular de eventos de toque seleccionados usandoOnClickListener
o en su propioGestureDetector
oOnTouchListener
, como subclase añadir superposiciones, cacerola mientras que el zoom, y lanzar impulso.No pretende ser un reemplazo de uso general, por
ImageView
lo que no lo extiende y no admite la visualización de imágenes de recursos, solo activos y archivos externos. Requiere SDK 10.La fuente está en GitHub, y hay una muestra que ilustra el uso en a
ViewPager
.https://github.com/davemorrissey/subsampling-scale-image-view
fuente
Puede intentar usar los LayoutParams para esto
ZoomIn = zoom (verdadero); ZoomOut = zoom (falso);
fuente
y la carpeta dibujable debe tener un archivo de imagen bticn. funciona perfectamente :)
fuente
Algo como a continuación lo hará.
Para ver el programa completo, vea aquí: Programa para ampliar la imagen en Android
fuente