解决ScrollView和VerticalViewPager滑动事件冲突问题

我的例子是ViewPager 里嵌套ScrollView。

目前,看了下网上搜的大部分解决垂直的ViewPager和ScrollView的滑动事件冲突。即,左右滑动时,ViewPager不翻页。

基本都是重写ScrollView, 解决当滑动水平距离小于垂直距离时,让viewpager切换pager。

我这里碰到的问题是,当ViewPager里嵌套的ScrollView下滑,滑ScrollView到到顶部时,VerticalViewPager应该被带动滑动。可是我的代码却没有。

我用的VerticalViewPager是: https://github.com/castorflex/VerticalViewPager

仔细看了他的VerticalViewPager,发现,在onInterceptTouchEvent事件里,应该可以写点儿什么,当ScrollView滑到顶部时,阻止Touch事件的分发。

 

于是在ViewPager 的 onInterceptTouchEvent方法里,添加了这段代码

 

if (dy != 0 && !isGutterDrag(mLastMotionY, dy) && canScroll(this, false, (int) dy, (int) x, (int) y)) {
                    // Nested view has scrollable area under this point. Let it be handled there.
                    mLastMotionX = x;
                    mLastMotionY = y;
                    mIsUnableToDrag = true;

/////////////////////我添加的//////////////////////////////////////////////////////////////////////////////
                    // 在MyScrollView 视图向下滑动时,继续传递事件,
                    // 向上滑动时,判断如果MyScrollView滑到顶不了,就不在传递事件。
                    Activity act = (Activity)context;
                    MyScrollView sv = (MyScrollView) act.findViewById(R.id.onlysv);
                    float height = sv.getTopHeight(); 
                    MyLog.i("--tom", ",sv height:" + height + "dy" + dy );
                    if (sv.getTopHeight() > 0){
                    	return false;
                    } else {
                    	if(dy < 0){
                    		MyLog.i("--tom", "dx < 0 viewpage interceptTouchEvent return false");
                    		return false;
                    	}
                    	MyLog.i("--tom", "dx >= 0 viewpage interceptTouchEvent return true");
                    	return true;
                    }
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}
 

上下文context需要在VerticalViewPager的构造方法里获取。

自定义的ScrollView代码如下。

import com.mygame.pure.log.MyLog;

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;

public class MyScrollView extends ScrollView {
	GestureDetector gestureDetector;
	View.OnTouchListener onTouchListener;
	public static float firstPoint;
	
	public float getTopHeight(){
		return firstPoint;
	}

	public MyScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// 添加了一个手势选择器
		gestureDetector=new GestureDetector(new Yscroll());
		setFadingEdgeLength(0);
	}
	

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			break;
		case MotionEvent.ACTION_MOVE:
			firstPoint = getScrollY();
			MyLog.i("--tom", "getScrollY():" + firstPoint);
			break;
		default:
			break;
		}
		
		return super.onTouchEvent(ev);
	}




	public boolean onInterceptTouchEvent(MotionEvent ev) {
		// TODO Auto-generated method stub
		// return super.onInterceptTouchEvent(ev);
		boolean flags = super.onInterceptTouchEvent(ev) && gestureDetector.onTouchEvent(ev);
//		if(getScrollY() == 0){
//			return false;
//		}
		MyLog.i("--tom", "MyScrollView:onInterceptTouchEvent" + flags);
		return flags;  
	}
	
	class Yscroll extends SimpleOnGestureListener{
		@Override
		public boolean onScroll(MotionEvent e1, MotionEvent e2,
			float distanceX, float distanceY) {
			//控制手指滑动的距离
			if (Math.abs(distanceY)>=Math.abs(distanceX)) {
				return true;
			}
			return false;
		}
	}

}

一开始,设置那个firstPoint只是普通成员变量还不行,因为滑动scrollview到底部了,发现在VerticalViewPager里获取该变量,竟然为0.没找到原因,后来改成静态变量就好了。原因,待以后详究吧。

 

 

 

你可能感兴趣的:(android开发)