ViewPager 嵌套 ViewPager的解决方法

来源:互联网 发布:化学方程式书写软件 编辑:程序博客网 时间:2024/05/22 11:09

需求是viewpager里面嵌套一个viewpager,一开始没做任何处理的时候,子viewpager无法收到滑动的事件,但是现在的需求是操作子viewpager时不能被父viewpager拦截,找到解决方法:

http://my.eoe.cn/elvnxuan/archive/18214.html

public class ChildViewPager extends ViewPager{    /** 触摸时按下的点 **/    PointF downP = new PointF();    /** 触摸时当前的点 **/    PointF curP = new PointF();     OnSingleTouchListener onSingleTouchListener;    public ChildViewPager(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub    }    public ChildViewPager(Context context) {        super(context);        // TODO Auto-generated constructor stub    }    @Override    public boolean onInterceptTouchEvent(MotionEvent arg0) {        // TODO Auto-generated method stub        //当拦截触摸事件到达此位置的时候,返回true,        //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent        return true;    }    @Override    public boolean onTouchEvent(MotionEvent arg0) {        // TODO Auto-generated method stub        //每次进行onTouch事件都记录当前的按下的坐标        curP.x = arg0.getX();        curP.y = arg0.getY();        if(arg0.getAction() == MotionEvent.ACTION_DOWN){            //记录按下时候的坐标            //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变            downP.x = arg0.getX();            downP.y = arg0.getY();            //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰            getParent().requestDisallowInterceptTouchEvent(true);        }        if(arg0.getAction() == MotionEvent.ACTION_MOVE){            //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰            getParent().requestDisallowInterceptTouchEvent(true);        }        if(arg0.getAction() == MotionEvent.ACTION_UP){            //在up时判断是否按下和松手的坐标为一个点            //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick            if(downP.x==curP.x && downP.y==curP.y){                onSingleTouch();                return true;            }        }        return super.onTouchEvent(arg0);    }        /**     * 单击     */    public void onSingleTouch() {        if (onSingleTouchListener!= null) {            onSingleTouchListener.onSingleTouch();        }    }    /**     * 创建点击事件接口     * @author wanpg     *     */    public interface OnSingleTouchListener {        public void onSingleTouch();    }    public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {        this.onSingleTouchListener = onSingleTouchListener;    }}

参考帖子地址:http://my.eoe.cn/wanpg/archive/2096.html

解决方案2:

重写ScrollView的onInterceptTouchEvent()回调函数。需要在程序里新加一个ScrollViewExtend类并继承自ScrollView,下面是其代码:

package com.image.indicator.control;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.ScrollView;/** * 能够兼容ViewPager的ScrollView * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题 * @File: ScrollViewExtend.java * @Package com.image.indicator.control * @Author Hanyonglu * @Date 2012-6-18 下午01:34:50 * @Version V1.0 */public class ScrollViewExtend extends ScrollView {    // 滑动距离及坐标    private float xDistance, yDistance, xLast, yLast;    public ScrollViewExtend(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        switch (ev.getAction()) {            case MotionEvent.ACTION_DOWN:                xDistance = yDistance = 0f;                xLast = ev.getX();                yLast = ev.getY();                break;            case MotionEvent.ACTION_MOVE:                final float curX = ev.getX();                final float curY = ev.getY();                xDistance += Math.abs(curX - xLast);                yDistance += Math.abs(curY - yLast);                xLast = curX;                yLast = curY;                if(xDistance > yDistance){                    return false;                }          }        return super.onInterceptTouchEvent(ev);    }}


参考帖子地址:http://www.cnblogs.com/hanyonglu/archive/2012/06/19/2555113.html






以下是我的实际解决方法,自定义ViewPager


public class MyViewPager extends ViewPager {public FaceViewPager(Context context, AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {LogPrint.debug("FaceViewPager:" + ev.getAction());if(ev.getAction() == MotionEvent.ACTION_DOWN || ev.getAction() == MotionEvent.ACTION_MOVE) {getParent().requestDisallowInterceptTouchEvent(true);}return super.dispatchTouchEvent(ev);}}