viewpager嵌套开源组件gesture-imageview实现图片浏览和缩放

来源:互联网 发布:编程的机器人 编辑:程序博客网 时间:2024/05/07 14:34

gesture-imageview的github地址

下载后将包com.polites.android放入src中,如图:



直接可以在代码中构建gestureImageView的类实例并使用,在viewPager的adapter中重写:

[java] view plaincopy
  1. @Override  
  2. public Object instantiateItem(ViewGroup container, int position) {  
  3.     GestureImageView iv = new GestureImageView(mContext);  
  4.     iv.setImageBitmap(your-bitmap-here);  
  5.     ((ViewPager) container).addView(iv, 0);  
  6.     return iv;  
  7. }  

可以说,当这个imageView单独使用时,它的功能是挺完美的。

但当前版本的imageview被外层滑动组件嵌套时会有问题,不能直接嵌套使用,当左右滑动时,会默认应用viewpager的滑动(即使你并不想滑动viewpager,只是想拖动放大了之后的图片而已)。

viewPager的应用详见issue#30

找到com.polites.android.GestureImageViewTouchListener,我们要做的,就是判断当前imageview是否是被放大的状态,如果当前imageview被放大了,就禁止父组件消费触摸事件。

新加变量:

[java] view plaincopy
  1. private boolean zoomed;  
新加方法:
[java] view plaincopy
  1. public boolean isZoomed(){  
  2.     return zoomed;  
  3. }  
  4. public void setZoomed(boolean zoomed){  
  5.     this.zoomed = zoomed;  
  6. }  

新加一句代码,在每次改变lastScale之后,判断是否恢复到原始或者进行了缩放:

(你可以在文件中搜索lastScale以找到它)

[java] view plaincopy
  1. lastScale = currentScale;  
  2. /** 
  3.  * recalculate zoomed after lastScale changed. 
  4.  */  
  5. zoomed = !(Math.abs(lastScale - startingScale) < 0.01);  

在onTouch方法的开头,补充:

[java] view plaincopy
  1. @Override  
  2. public boolean onTouch(View v, MotionEvent event) {  
  3.     if (isZoomed())  
  4.         image.getParent().requestDisallowInterceptTouchEvent(true);  
如果被缩放,就禁止父组件消费。


修改之后,当且仅当 gesture-imageview被缩小到原始规模时,才可以进行viewpager的换页。

效果图:


PS:之后的其他#issue中也提到了,如果能更好地支持viewpager,比如当图片的边界顶到屏幕边界时变可以切换图片等等就好了。

0 0
原创粉丝点击