Android ViewPager嵌套ViewPager滑动冲突处理方法

dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,
然后决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。
返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。
onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。
onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,
不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,
因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的(iOS可以)。
package com.lwj.app.customview;

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

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 onTouchEvent(MotionEvent arg0) {
        // TODO Auto-generated method stub
        //每次进行onTouch事件都记录当前的按下的坐标
        if(getChildCount()<=1)
        {
          return super.onTouchEvent(arg0);
        }
        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 || arg0.getAction() == MotionEvent.ACTION_CANCEL){
            //在up时判断是否按下和松手的坐标为一个点
            //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
            getParent().requestDisallowInterceptTouchEvent(false);
            if(downP.x==curP.x && downP.y==curP.y){

                return true;
            }
        }
         super.onTouchEvent(arg0); //注意这句不能 return super.onTouchEvent(arg0); 否则触发parent滑动
        return true;
    }

}
时间: 2024-10-11 01:00:32

Android ViewPager嵌套ViewPager滑动冲突处理方法的相关文章

ViewPager嵌套ViewPager后子ViewPager滑动不正常问题

ViewPager嵌套ViewPager后,滑动事件没法在子ViewPager里面响应. 解决办法是自定义子ViewPager. 以下代码是转载的,经本人测试,可以用!!! 转载地址:http://blog.csdn.net/leewenjin/article/details/21011841 package com.lwj.app.customview; import android.content.Context; import android.graphics.PointF; import

Viewpager嵌套Viewpager遇到的一些问题

Viewpager嵌套Viewpager,如果内层的滑动卡顿,那么需要将其实只要用外层Viewpager调用setOnTouchListener方法就将左右滑动禁用了, 但是如果内层的Viewpager可以正常滑动,但是在滑动到最后一页的时候底层 当将内层ViewPager滑到底时,上面调用的方法貌似约束不了他,他会先拉出一点点,再划几次就慢慢就划过一半了,但是划不到另一个界面这个时候内层的viewpager需要自定义一个viewpager来处理事件分发

ScrollView 嵌套ListView 滑动冲突,与显示不全

import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; /** * * @author jiarh *2014-8-14 */ public class UserListView extends ListView { public UserListView(Context context) { super(context); } public UserLis

处理ViewPager嵌套ViewPager的滑动事件冲突

开发时遇到一个问题:使用ViewPager+Fragment实现滑动tab切换,在其中某一个Fragment中嵌套一个ViewPager轮播卡片.测试发现轮播卡片不能进行左右滑动了. 看了不少博文,都是通过覆盖onInterceptTouchEvent等方法拦截事件处理,例如: @Override public boolean dispatchTouchEvent(MotionEvent ev) { mPager.requestDisallowInterceptTouchEvent(true);

Android之viewPager嵌套viewPager无法滑动子viewPager

现在最头疼的事就是需求不明确,这不,有遇到你个奇葩需求,父viewPager总共有三个选项卡,第一个选项卡里嵌入一个子viewPager,这时候问题就来了,子viewPager无法滑动,我猜的事父viewPager把子viewPager拦截了,于是尝试了下面的第一种方法 1.重写父viewPager的onInterceptTouchEvent方法 /** * @author 子墨 * * 2015-2-26上午8:59:50 */ public class MyViewPager extends

ViewPager嵌套viewpager有什么冲突问题

Viewpager q嵌套 viewPager ,左右滑动事件的冲突,外围的ViewPager要重写几个方法就可以了: onTouchEvent,OnInterceptTouchEvent,在这两个方法中加入自定义样式,在使用的时候根据需要选择 使用系统自己的处理方法或者用户自定义的方式 public class MYViewPager extends ViewPager { private boolean swipeable; public MYViewPager(Context contex

Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案

为了解决这个问题.可以自定义viewpager,然后在里面监听首饰,自定义点击事件 package com.hpuvoice.view; import android.content.Context; import android.graphics.PointF; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.GestureDetector; impo

ViewPager嵌套ViewPager 滑动冲突

我在网上找了许多解决方法.但都不是很完美. 当进入子viewpager确实解决了子viewpager的滑动,但是父viewpager就失效了.现在奉上修改过的代码给大家. //别忘了布局引用也要变 /** *    <com.jing.meknow.ChildViewPager *        android:id="@+id/iask_main_view_pager" *        android:layout_width="match_parent"

解决ScrollView嵌套ViewPager出现的滑动冲突问题

/** * */ public class ScrollView1 extends ScrollView { private boolean canScroll; private GestureDetector mGestureDetector; View.OnTouchListener mGestureListener; public ScrollView1(Context context, AttributeSet attrs) { super(context, attrs); mGestu