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

来源:互联网 发布:卞正伟淘宝店 编辑:程序博客网 时间:2024/05/16 07:47

目前,看了下网上搜的大部分解决垂直的ViewPager和ScrollView的滑动事件冲突。

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


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


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


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


于是在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);}@Overridepublic 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{@Overridepublic 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.没找到原因,后来改成静态变量就好了。原因,待以后详究吧。


2 0
原创粉丝点击