ViewPager+可缩放ImageView的使用

来源:互联网 发布:越南废除汉字 知乎 编辑:程序博客网 时间:2024/06/05 17:36

       最近项目遇到一个需求,就是在ViewPager里面放置图片,而且每个图片需要可以缩放的。

       这种需求相对来说不是很难了,因为网上绝对有很多类似的开源,大家拿过来就可以用了。我之前也是这么做的,直到我发现开源框架没有提供我需要的那个功能之后,我就放弃了。 之前我是在ViewPager里面使用PhotoView这个开源框架的。但是他没有处理图片缩放与ViewPager的滑动的一个冲突。具体表现就是,当你想缩放图片的时候,可能会导致ViewPager的滑动。

        这个问题的解决方式其实也很简单,就是在PhotoView的onTouch里面判断,多点时,就不让滑动即可。可是PhotoView这个框架封装的很好,他的PhotoView这个类甚至都没有重写onTouch方法。我自己重写了一下,然后在里面处理,根本没用。

        然后,我在网上搜了很多资源,都没有找到很满意的。然后我看到了http://blog.csdn.net/lmj623565791/article/details/39480503 这个博客。发现他写到很详细,而且代码没有PhotoView这个框架那么多。而且注释很清晰。不过不幸的是,他也没有去解决这个冲突。于是,我在他代码的基础上,加上了这个冲突的解决,于是我的需求搞定了。

       然后额外发现一个问题,就是在多点触控的时候,有时候会报

java.lang.IllegalArgumentException: pointerIndex out of range

这个异常,又在网上查资料,然后在http://blog.csdn.net/nnmmbb/article/details/28419779这个博客看到了解决方案,我就按照他的方式,自己写一个ViewPager,并在里面try..catch。然后果然catch到异常了,然后程序就没有崩溃了。

 

       总结:实现了ViewPager+可缩放的ImageView。实现,在缩放时,不产生ViewPager的滑动,在缩放时,程序不崩溃。但是其实还有两个需求没有解决:就是缩放之后的图片,在二次显示的时候,没有还原到初始大小;图片只是在初始大小的基础上进行放大,及放大后的缩小,一开始就缩小还没有实现。

 

代码和第一个博客地址的代码无差别。就是添加了

int count = event.getPointerCount();if (count > 1) {// 当滑动时,手指超过一个就不允许ViewPager滑动getParent().requestDisallowInterceptTouchEvent(true);}


 

这几句代码,在触摸移动的末尾添加即可。

=========================================================================

一开始就可以缩小,也找到解决方式了,还是在第一个博客地址的代码上,做一点点修改:

/** * 缩放的范围控制 */float smallScale = initScale/2;if ((scale < SCALE_MAX && scaleFactor > 1.0f)|| (scale > smallScale && scaleFactor < 1.0f)) {/** * 最大值最小值判断 */if (scaleFactor * scale < smallScale) {scaleFactor = smallScale / scale;}if (scaleFactor * scale > SCALE_MAX) {scaleFactor = SCALE_MAX / scale;}/** * 设置缩放比例 */mScaleMatrix.postScale(scaleFactor, scaleFactor,detector.getFocusX(), detector.getFocusY());checkBorderAndCenterWhenScale();setImageMatrix(mScaleMatrix);}


 

就是添加一个缩小值,即可。代码还是他的代码。

 

###################

缩放的ImageView在ViewPager滑动中的二次还原实现:

1. 要重写ViewPager的getItemPosition方法,返回return POSITION_NONE;为了销毁屏幕外的View;

@Overridepublic int getItemPosition(Object object) {return POSITION_NONE;}


 

2.设置ViewPager的滑动监听,在ViewPager的滑动监听OnPageChangeListener的重写方法里面添加如下代码:

<p> @Override  public void onPageScrollStateChanged(int state) {   if (ViewPager.SCROLL_STATE_IDLE == state ) {    adapter.notifyDataSetChanged();   }  }</p><p> }</p>

。这样就搞定了ViewPager的缩放ImageView的二次显示时候的,缩放还原。

######################

 

 

0 0