最近项目遇到一个需求,就是在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的二次显示时候的,缩放还原。
######################