zoomable android imageview android-viewpager pinchzoom

android - zoomable - Ver Paginador+ImageView+Pinch Zoom+Rotación



touch imageview android (5)

Quiero implementar Pinch Zoom en Imageview, con un View Pager similar a la Galería de Android predeterminada. He encontrado varias fuentes en 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 anteriores funcionan bien para la vista de una sola imagen. Pero cuando se trata de imágenes en el visor de imágenes, tienen algunos problemas y solo funcionan bien para la primera imagen en el visor de páginas. Cuando nos desplazamos a la 3ª 4ª imagen en el visor de páginas, la función de arrastre no funciona como se esperaba si la imagen está ampliada.

Por favor, si alguien sabe alguna buena biblioteca para hacer esto, entonces dame el enlace para ellos.


Corrigí la solución anterior. Puede desplazarse por la página, cuando ImageViewTouch es el 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; }

}


Después de varias horas de probar las soluciones anteriores, finalmente encontré la impresionante biblioteca de vista de imagen de Subsampling Scale , que funciona incluso con el ViewPager estándar del paquete de soporte de Android.


EDIT 2: el código de ejemplo se ha insertado en la rama maestra de TouchImageView. Aquí hay un enlace a la actividad de ejemplo y un enlace al ExtendedViewPager .

EDITAR: código agregado que adapta el enlace de ejemplo a TouchImageView. Nota: necesitará el último código, que actualmente se encuentra en la rama dev. En el futuro, esto se incluirá en v1.2.0. 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: modifique 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

<com.example.touch.ExtendedViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" />

TouchImageView es en realidad mi proyecto. Actualmente tengo una solución en la rama dev para la integración con ViewPagers, que se enviará a dominar en una próxima versión. Desafortunadamente, esta solución solo es aplicable para API 14 y superior, ya que honeycomb y anteriores no llaman a canScrollHorizontally . Si necesita admitir las API más antiguas, deberá implementar una solución 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 propio 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 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; } } }