Android 解决ViewPager双层嵌套的滑动问题

之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就是ViewPager,整个软件只有广告这一部分ViewPager还好说,但是软件越复杂出现的问题越多,尤其是遇到ViewPager双层嵌套问题,找了很多资料

解决方法一:自定义ViewPager做为父ViewPager控件

public class ParentViewPager extends ViewPager{
    private int childVPHeight=0;
    public ParentViewPager(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        init(context);
    }

    public ParentViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        init(context);
    }

    private void init(Context context) {
        // TODO Auto-generated method stub
        // 获取屏幕宽高
        WindowManager windowManager = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);
        int disWidth = windowManager.getDefaultDisplay().getWidth();
        //根据屏幕的密度来过去dp值相应的px值
        childVPHeight=(int) (context.getResources().getDisplayMetrics().density  * disWidth + 0.5f);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        // TODO Auto-generated method stub
        //触摸在子ViewPager所在的页面和子ViewPager控件高度之内时
        //返回false,此时将会将触摸的动作传给子ViewPager
        if(getCurrentItem()==1 && arg0.getY()<childVPHeight){
            return false;
        }
        return super.onInterceptTouchEvent(arg0);
    }   

此方法虽然简单可行,但是会出现,子ViewPager如果为ScrollView的时候,子ViewPager虽然已经滑动到看不到的地方,但是设定的高度内还是不能让父ViewPager左右滑动,onTouch的动作透过了父Viewpager传递到了子控件

解决方法二:自定义Viewpager做为子控件

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;
    }

}

为什么要自己定义onSingleTouch呢?

因为在ViewPager的onTouchEvent中我对onDown进行了操作,进行了操作后就无法将touch事件继续往下传给onClick和其内部控件的任何事件,所以自己做了判断,做了个singleTouch来实现点击的事件

方法二可以完美解决双层ViewPager嵌套后子ViewPager的触摸滑动问题

时间: 2024-10-10 04:38:04

Android 解决ViewPager双层嵌套的滑动问题的相关文章

Android使用ViewPager实现左右循环滑动及轮播效果

ViewPager是一个常用的android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其他页面的信息. 为此我查阅了网络上现有的一些关于实现这样效果的例子,但都不是很满意,经过反复实验,在这里总结并分享给大家,希望能有所帮助. 循环滑动效果的实现:PagerAdap

Android - 解决ViewPager嵌套时在API 13及其以下版本中不能滑动的问题

通过对ViewPager事件处理的分析发现解决此问题的关键点在于判断是否可以横向滑动的部分,也就是canScroll(View, boolean, int, int, int)方法 在此方法中先依次递归判断子View是否可以横向滑动,在最后一行则判断自己是否可以横向滑动.关键处在于调用了ViewCompat.canScrollHorizontally(View, int)方法来判断是否可以横向滑动.进一步查看ViewCompat.canScrollHorizontally(View, int)的

Android中ViewPager与HorizontalListView的滑动冲突处理

Android开发中,有不少的控件都有点击或滑动冲突事件,比如ListView的onitemclick事件与item上的Button(如果有Button的话)等.今天在工作中用ViewPager里面的页面套用HorizontalListView,横向 划动也有冲突,解决办法很简单,只要在HorizontalListView中重写onInterceptTouchEvent(MotionEvent ev)方法中添加 getParent().requestDisallowInterceptTouchE

【Android】ViewPager实现图片左右滑动播放及添加点击事件

前两天老师找我帮她写个Android的demo.说是要实现一个图片左右滑动的效果,并且点击图片的时候会发出声音. 由于好久没写过Android了,所以花了一段时间来复习和学习.现将过程和实现简单记录如下.(项目参照了一部分CSDN博主Android将军的) 实现使用的是ViewPager 代码如下:在点击监听的部分,通过获取List<>中的控件添加触摸监听.当然你可以在各个页面添加多个控件,然后在获取该界面的控件,然后各个添加监听. 而且代码有优化的地方...不过只是为了演示,就没有太花时间去

Android 使用ViewPager实现左右循环滑动图片

ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1.    首先看一些layout下的xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layo

Android - 解决ViewPager使用DepthPageTransformer时事件会被下一页捕获导致事件错乱的问题

实际情况是你在调用 viewPager.setPageTransformer(boolean, PageTransformer)方法设置PageTransformer时第一个参数给的false,应该设置true才对. 这是因为ViewPager默认下一个页面是绘制在上一个页面的上面,DepthPageTransformer对下一个页面的处理是只设为全透明,但还是位于屏幕中央.这样一来下一个页面虽然看不见,但实际上是存在于上一个页面的上面的,理所当然就会拦截事件. 而第一个参数的意思就是是否要反转

Android 解决WebView和ScrollView滚轮滑动冲突

第一步,重写WebView的onGenericMotionEvent方法 /** * 滑轮处理 */ @Override public boolean onGenericMotionEvent(MotionEvent event) { if (callback != null) return callback.onGenericMotionEvent(event); return super.onGenericMotionEvent(event); } //定义一个接口,把滚动事件传递出去 pu

Android listview viewpager解决冲突 滑动

Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第一栏添加 viewpager 当做header 如: 当触发 滑动事件 的时候容易引起 滑动冲突    (比如斜着滑动viewpager  的时候 listview会跳动) 特别是在  下拉刷新或者上拉加载 的时候 , 组件可能会传递到viewpager当中 查阅了很多的帖子  发现修改起来都非常麻烦

ViewPager中嵌套HorizontalScrollView导致无法滑动换页冲突解决

在之前的开发过程中,遇到过ViewPager中嵌套HorizontalScrollView导致无法横向滑动换页,最终也是通过对onTouchEvent方法判断滑动的状态来进行控制左右的滑动,注意的是onTouchEvent的事件分发的方向正好与onInterceptTouchEvent相反,是从下往上分发的,所以也会先执行子View的onTouchEvent方法(如果想进一步了解View的分发机制可以去进一步查阅资料,比如http://blog.csdn.net/a553181867/artic