Ver Buscapersonas + ImageView + Zoom de Pinch + Rotación

Quiero implementar Pinch Zoom en Imageview, en View Pager similar a Default Android Gallery. He encontrado múltiples fonts sobre GitHub, pero el zoom y el deslizamiento solo funcionan para la primera imagen.

Lo que he intentado:

1.) TouchImageView

2.) PhotoView

3.) Android Touch Gallery

Todos los enlaces de arriba funcionan bien para la vista de una sola imagen. Pero cuando se trata de las imágenes en la vista del localizador, tienen algunas fallas técnicas y solo funcionan bien para la primera imagen en el Buscapersonas de la Vista. Cuando nos desplazamos a la tercera y cuarta imagen en el buscapersonas, la funcionalidad de arrastrar no funciona como se esperaba si la imagen se amplía.

Por favor, si alguien conoce una buena biblioteca para hacer esto, entonces proporcione el enlace para ellos.

EDIT 2: El código de ejemplo se ha enviado a la twig principal de TouchImageView. Aquí hay un enlace a la actividad de ejemplo y un enlace a ExtendedViewPager .


EDITAR: código agregado que adapta el enlace de ejemplo a TouchImageView. Nota: necesitará el código más reciente, que se encuentra actualmente en la twig de desarrollo. En el futuro, esto se incluirá en v1.2.0. Usted sabe que tiene el código más reciente si TouchImageView anula canScrollHorizontally.

Paso 1 : Extienda ViewPager y anule canScroll para llamar a canScrollHorizontallyFroyo.

public class ExtendedViewPager extends ViewPager { public ExtendedViewPager(Context context) { super(context); } public ExtendedViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if (v instanceof TouchImageView) { return ((TouchImageView) v).canScrollHorizontallyFroyo(-dx); } else { return super.canScroll(v, checkV, dx, x, y); } } } 

Paso 2: Modifica TouchImageView agregando canScrollHorizontallyFroyo:

 public boolean canScrollHorizontallyFroyo(int direction) { return canScrollHorizontally(direction); } 

Paso 3: tu actividad

 public class TouchImageViewActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ExtendedViewPager mViewPager = (ExtendedViewPager) findViewById(R.id.view_pager); setContentView(mViewPager); mViewPager.setAdapter(new TouchImageAdapter()); } static class TouchImageAdapter extends PagerAdapter { private static int[] images = { R.drawable.img1, R.drawable.img2, R.drawable.img3 }; @Override public int getCount() { return images.length; } @Override public View instantiateItem(ViewGroup container, int position) { TouchImageView img = new TouchImageView(container.getContext()); img.setImageResource(images[position]); container.addView(img, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); return img; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } } } 

Paso 4: main.xml

  

TouchImageView es en realidad mi proyecto. Actualmente tengo una solución en la twig de desarrollo para la integración con ViewPagers, que será empujada a dominar en una próxima versión. Desafortunadamente, esta corrección solo es aplicable para API 14 y superior desde honeycomb y antes no se puede canScrollHorizontally . Si necesita admitir API antiguas, deberá implementar una solución alternativa en su ViewPager. Aquí hay un ejemplo.

Encontré una solución bonita con la biblioteca ImageViewZoom . Para desplazar la imagen ampliada en ViewPager creé mi propia ViewPager:

 public class ExtendedViewPager extends ViewPager { public ExtendedViewPager(Context context) { super(context); } public ExtendedViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if (v instanceof ImageViewTouch) { return ((ImageViewTouch) v).canScroll(dx); } else { return super.canScroll(v, checkV, dx, x, y); } } } 

Ver más https://gist.github.com/atermenji/3781644

Mi solución con ImageViewZoom Library se basa en este ViewPager personalizado:

 public class ImageViewTouchViewPager extends ViewPager { public ImageViewTouchViewPager(Context context) { super(context); } public ImageViewTouchViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if (v instanceof ImageViewTouch) { ImageViewTouch imageViewTouch = (ImageViewTouch)v; if (imageViewTouch.getScale() == imageViewTouch.getMinScale()) { return super.canScroll(v, checkV, dx, x, y); } return imageViewTouchCanScroll(imageViewTouch, dx); } else { return super.canScroll(v, checkV, dx, x, y); } } /** * Determines whether the ImageViewTouch can be scrolled. * * @param direction - positive direction value means scroll from right to left, * negative value means scroll from left to right * @return true if there is some more place to scroll, false - otherwise. */ private boolean imageViewTouchCanScroll(ImageViewTouch v, int direction){ RectF bitmapRect = v.getBitmapRect(); Rect imageViewRect = new Rect(); getGlobalVisibleRect(imageViewRect); if (null == bitmapRect) { return false; } if (direction < 0) { return Math.abs(bitmapRect.right - imageViewRect.right) > 1.0f; }else { return Math.abs(bitmapRect.left - imageViewRect.left) > 1.0f; } } } 

Después de varias horas probando las soluciones anteriores, finalmente encontré la impresionante biblioteca Subsampling Scale Image View , que funciona incluso con ViewPager estándar del Android Support Package.

Corregí la solución anterior. Puede desplazarse por la página, cuando ImageViewTouch es modo de zoom.

 public class ImageViewTouchViewPager extends ViewPager { public ImageViewTouchViewPager(Context context) { super(context); } public ImageViewTouchViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if (v instanceof ImageViewTouch) { ImageViewTouch imageViewTouch = (ImageViewTouch)v; return imageViewTouchCanScroll(imageViewTouch, dx); } else { return super.canScroll(v, checkV, dx, x, y); } } /** * Determines whether the ImageViewTouch can be scrolled. * * @param direction - positive direction value means scroll from right to left, * negative value means scroll from left to right * @return true if there is some more place to scroll, false - otherwise. */ private boolean imageViewTouchCanScroll(ImageViewTouch imageViewTouch, int direction){ int widthScreen = getWidthScreen(); RectF bitmapRect = imageViewTouch.getBitmapRect(); Rect imageViewRect = new Rect(); getGlobalVisibleRect(imageViewRect); int widthBitmapViewTouch = (int)bitmapRect.width(); if (null == bitmapRect) { return false; } if(widthBitmapViewTouch < widthScreen){ return false; } if (direction < 0) { return Math.abs(bitmapRect.right - imageViewRect.right) > 1.0f; }else { return Math.abs(bitmapRect.left - imageViewRect.left) > 1.0f; } } private int getWidthScreen(){ WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); Point size = new Point(); display.getSize(size); return size.x; } 

}