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.

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.

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

  • ¿Cómo manejar el botón de nuevo utilizando el buscapersonas?
  • Efecto Parallax de Android y View Pager
  • Añadir y quitar dinámicamente la vista a viewpager
  • Pantalla automática automática de ViewPager
  • Servicio de Android> Actividad> Fragmento con ViewPager
  • ViewPager Circular con menos de 4 visitas
  • Android: Implementación de Viewpager de dos vías sin fin
  • Inflar nuevo diseño xml para cada vista - instantiateItem in PagerAdapter
  • Efecto Parallax en ViewPager de Android
  • ¿Cómo crear la página de inicio de sesión de Salesforce dentro del buscador de vista de Android?
  • ViewPager desactiva el desplazamiento a una dirección determinada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.