viewpager跟HorizontalScrollView,listview冲突的问题

来源:互联网 发布:淘宝小叶紫檀真假 编辑:程序博客网 时间:2024/05/16 00:55

这几天做到一个小qpp,发现一个严重的问题,因为主要布局是一个HorizontalScrollView里面装了个viewpager包含fragment,恰好我有又想实现一个侧边栏,所以发现app运行之后,侧滑栏虽然能够滑动,但是viewpager完全不能用了,不能滑动,就连tablelayout按钮都不能用了,就上网查询了下资料,原来是viewpager和HorizontalScrollView冲突了,HorizontalScrollView里面viewpager的活动被HorizontalScrollView父view拦截了,所以我们为了能够实现两者的协调,必须分情况到底父view是否该拦截子view的活动。拦截了侧滑栏就能活动,不拦截viewpager就能活动。


getParent().requestDisallowInterceptTouchEvent(true);把touch主动权交给子view处理,不拦截touch事件,也就是viewpager
getParent().requestDisallowInterceptTouchEvent(flse);把touch主动权交给父view处理,拦截touch事件,也就是HorizontalScrollView
具体代码如下:
package com.example.a1.myapplication.View;import android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;public class ChildViewPager extends ViewPager {    public ChildViewPager(Context context, AttributeSet attrs) {        super(context, attrs);    }    public ChildViewPager(Context context) {        super(context);    }    // 滑动距离及坐标 归还父控件焦点    private float xDistance, yDistance, xLast, yLast,xDown, mLeft;    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        //把touch主动权交给子view处理,不拦截touch事件,也就是viewpager        getParent().requestDisallowInterceptTouchEvent(true);        switch (ev.getAction()) {            case MotionEvent.ACTION_DOWN:                xDistance = yDistance = 0f;                xLast = ev.getX();                yLast = ev.getY();                xDown = ev.getX();                mLeft = ev.getX();                // 解决与侧边栏滑动冲突                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 (mLeft < 100 || xDistance < yDistance) {                    getParent().requestDisallowInterceptTouchEvent(false);                } else {                    if (getCurrentItem() == 0) {                        if (curX < xDown) {                            getParent().requestDisallowInterceptTouchEvent(true);                        } else {                            getParent().requestDisallowInterceptTouchEvent(false);                        }                    } else if (getCurrentItem() == (getAdapter().getCount()-1)) {                        if (curX > xDown) {                            getParent().requestDisallowInterceptTouchEvent(true);                        } else {                            getParent().requestDisallowInterceptTouchEvent(false);                        }                    } else {                        getParent().requestDisallowInterceptTouchEvent(true);                    }                }                break;            case MotionEvent.ACTION_UP:            case MotionEvent.ACTION_CANCEL:                break;        }        return super.dispatchTouchEvent(ev);    }}
在今后使用中只需要使用上述代码然后在layout布局文件中使用
            <com.hk.View.ChildViewPager                android:id="@+id/pager"                android:layout_width="match_parent"                android:layout_height="wrap_content"                >            </com.hk.ChildViewPager>

然后就ok了,而且你觉得想实现侧滑栏实现的简单点,可以删除一些上面代码的东东西,当然listview也是同样的道理,相信大神的你们都会领悟。

阅读全文
1 0
原创粉丝点击