Problema de zoom con ViewPager y ImageView
Estoy intentando implementar una Galería de imágenes usando ViewPager. Además, para implementar la función de zoom en eso, estoy utilizando TouchImageView de github. También he intentado usar ZoomableImageView .
Pero, el problema es, si hago zoom en la imagen y si hago el desplazamiento de la imagen, entonces en vez de la imagen, ViewPager
se está desplazando y la siguiente vista de ViewPager
se está cargando.
- Indicadores de flecha izquierda-derecha sobre un ViewPager
- Gridview - Haga clic en la imagen para ver la imagen en Viewpager
- Texto diferente para cada imagen en el visor de imágenes
- Establecer la página predeterminada de ViewPager en Android
- Android - Utilizar el dedo de izquierda a derecha para volver
Si el zoom de la imagen, entonces si se desplaza que, entonces la imagen tiene que moverse en lugar de ViewPager
La siguiente vista de ViewPager tiene que cargarse solo si llega al final de la imagen ampliada. ¿Como hacer eso?
No puedo encontrar eso. Si toco y arrasto la imagen diagonalmente, sólo entonces la imagen se está moviendo. O bien se está invocando el arrastre de ViewPager.
Ps: esto no es duplicado. El zoom está hecho. Pero el problema es después del zoom de imagen.
- ¿Cómo tener un efecto de paralaje entre 2 ViewPagers?
- Usar backstack con ViewPager
- Problema de zoom de imagen con Universal Image Loader y View Pager
- La mejor manera de desactivar la paginación de ViewPager
- Swiping de Android, usando ViewPager sin pestañas
- El método makeText en el tipo Toast no es aplicable para los argumentos
- PagerAdapter posición inicial
- Bibliotecas de Mortero y Flujo vs. ViewPager
Sí, yo también tenía el mismo problema no con TouchImageView.
También resolvió el problema lo que hice se deshabilita el ViewPager cuando mi vista es conseguir el foco.
public class EnableDisableViewPager extends ViewPager { private boolean enabled = true; public EnableDisableViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { if(enabled) return super.onInterceptTouchEvent(arg0); return false; } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } }
Por lo que en TouchImageView implementar su oyente para activar un evento si su zoom o arrastrar.
Fije el listener a su objeto de la visión en su actividad. Así que cuando esos eventos ocurren, simplemente desactive la vista Pager.
Nota : también necesitará un evento de mouse para activar el viewpager.
EDITADO
Esto funcionará sólo para Zoom, por lo que para ViewPager para deslizar las páginas que debe volver al zoom original.
Agrega este código a tu TouchImageView
public class TouchImageView extends ImageView { ... private TouchEventListener touchEventListener; private void sharedConstructing(Context context) { ... setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ... case MotionEvent.ACTION_UP: ... if(touchEventListener != null) { if(saveScale == 1.0) touchEventListener.onZoomToOriginal(); else touchEventListener.onZoom(); } break; ... } ... } }); } ... public TouchEventListener getTouchEventListener() { return touchEventListener; } public void setTouchEventListener(TouchEventListener touchEventListener) { this.touchEventListener = touchEventListener; } public interface TouchEventListener { void onZoom(); void onZoomToOriginal(); } }
MEJOR SOLUCIÓN
Podríamos lograr esto sin extender ViewPager a una nueva clase usando el método que se da a continuación.
requestDisallowInterceptTouchEvent(true);
Y con esto podríamos deslizar sin acercar a la posición original como vemos en la Galería y muchas otras aplicaciones.
public class TouchImageView extends ImageView { ... private void stopInterceptEvent() { getParent().requestDisallowInterceptTouchEvent(true); } private void startInterceptEvent() { getParent().requestDisallowInterceptTouchEvent(false); } private void sharedConstructing(Context context) { super.setClickable(true); this.context = context; mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); matrix.setTranslate(1f, 1f); m = new float[9]; setImageMatrix(matrix); setScaleType(ScaleType.MATRIX); setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mScaleDetector.onTouchEvent(event); matrix.getValues(m); float x = m[Matrix.MTRANS_X]; float y = m[Matrix.MTRANS_Y]; PointF curr = new PointF(event.getX(), event.getY()); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: last.set(event.getX(), event.getY()); start.set(last); mode = DRAG; stopInterceptEvent(); break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { float deltaX = curr.x - last.x; float deltaY = curr.y - last.y; float scaleWidth = Math.round(origWidth * saveScale); float scaleHeight = Math.round(origHeight * saveScale); if (scaleWidth < width) { deltaX = 0; if (y + deltaY > 0) deltaY = -y; else if (y + deltaY < -bottom) deltaY = -(y + bottom); } else if (scaleHeight < height) { deltaY = 0; if (x + deltaX > 0) deltaX = -x; else if (x + deltaX < -right) deltaX = -(x + right); } else { if (x + deltaX > 0) deltaX = -x; else if (x + deltaX < -right) deltaX = -(x + right); if (y + deltaY > 0) deltaY = -y; else if (y + deltaY < -bottom) deltaY = -(y + bottom); } if(deltaX == 0) startInterceptEvent(); else stopInterceptEvent(); matrix.postTranslate(deltaX, deltaY); last.set(curr.x, curr.y); } break; case MotionEvent.ACTION_UP: mode = NONE; int xDiff = (int) Math.abs(curr.x - start.x); int yDiff = (int) Math.abs(curr.y - start.y); if (xDiff < CLICK && yDiff < CLICK) performClick(); startInterceptEvent(); break; case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; } setImageMatrix(matrix); invalidate(); return true; // indicate event was handled } }); } }
Lo conseguí para trabajar agregando este código:
if(deltaX == 0 && saveScale == 1.0 ) startInterceptEvent(); else stopInterceptEvent();
if(deltaX == 0 || saveScale == 1.0 ) startInterceptEvent(); else stopInterceptEvent();
Finalmente he encontrado la biblioteca de imágenes de escala de submuestreo , que funciona incluso con ViewPager estándar de Android Support Package sin ninguna personalización.
Si alguien tiene un viewpager horizontal, es un cambio importante @ kirit-vaghela código:
if(deltaX == 0 || saveScale == 1.0 ) startInterceptEvent(); else stopInterceptEvent();
A
if(saveScale == 1.0 ) startInterceptEvent(); else stopInterceptEvent();
Así que el adaptador va a cambiar la imagen sólo cuando es 1.0
- Actualizar una actividad del servicio cuando está activo
- Small Caps en TextViews, EditTexts y botones en Android