ViewPager+可缩放ImageView的使用

       最近项目遇到一个需求,就是在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;

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


 

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

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

 }

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

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

 

 

你可能感兴趣的:(实际需求解决方案)