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

转自:仿微信朋友圈图片查看-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;
    }

}

你可能感兴趣的:(viewpager,图片,冲突,photoview)