您的位置:首页 > 其它

自定义ViewPager,用来解决PhotoView和ViewPager的滑动冲突

2016-03-25 10:05 453 查看
转自:仿微信朋友圈图片查看-glide加载网络图片,photoview 实现缩放

这里实现的效果就和微信朋友圈点击图片后查看大图一样,如果你不清楚是什么效果,可以拿出手机,打开朋友圈,找到一条有很多图片的动态,点击图片进去。最终实现的效果就是这样的,多张图片滑动切换,并可缩放,拖动。

项目用到的第三方空间有:

glide,用来加载网络图片,google在自己应用里有用过这个东西。个人感觉十分好用,引入也简单。大公司出品,质量也有保证。

photoview:一个google工程师的个人项目,5k+的star,应该还算靠谱。其实我是无奈才用这个的,挑了很多个图片缩放的lib,其他和ViewPager都有滑动冲突问题,这个可以完美兼容。

本文开发环境是基于AS,Eclipse的朋友就需要自己调整了。整体构架是ViewPager+Fragment,一个图片一个Fragment显示,用Glide在Fragment里加载图片,图片的显示载体是PhotoView。下面上代码:

自定义ViewPager,用来解决PhotoView和ViewPager的滑动冲突,代码是作者提供的。

复制下面的代码,使用这个自定义的ViewPager即可解决PhotoView和ViewPager的滑动冲突报错的问题

package com.example.csonezp.imagezoomdemo;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
* Found at http://stackoverflow.com/questions/7814017/is-it-possible-to-disable-scrolling-on-a-viewpager. * Convenient way to temporarily disable ViewPager navigation while interacting with ImageView.
*
* Julia Zudikova
*/

/**
* Hacky fix for Issue #4 and
* http://code.google.com/p/android/issues/detail?id=18990 * <p/>
* ScaleGestureDetector seems to mess up the touch events, which means that
* ViewGroups which make use of onInterceptTouchEvent throw a lot of
* IllegalArgumentException: pointerIndex out of range.
* <p/>
* There's not much I can do in my code for now, but we can mask the result by
* just catching the problem and ignoring it.
*
* @author Chris Banes
*/
public class HackyViewPager extends ViewPager {

private boolean isLocked;

public HackyViewPager(Context context) {
super(context);
isLocked = false;
}

public HackyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
isLocked = false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (!isLocked) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException e) {
e.printStackTrace();
return false;
}
}
return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
return !isLocked && super.onTouchEvent(event);
}

public void toggleLock() {
isLocked = !isLocked;
}

public void setLocked(boolean isLocked) {
this.isLocked = isLocked;
}

public boolean isLocked() {
return isLocked;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: