viewpager跟HorizontalScrollView,listview冲突的问题,


这几天做到一个小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也是同样的道理,相信大神的你们都会领悟。

相关内容

    暂无相关文章