笔记67--ViewPager+ScrollView+ListView/GridView

来源:互联网 发布:淘宝是下订单扣钱 编辑:程序博客网 时间:2024/06/04 19:49

解决方法:

1、重写ScrollView。-------此解决方式有bug

public class MyScrollView extends ScrollView {private GestureDetector mGestureDetector;  public MyScrollView(Context context, AttributeSet attrs) {  super(context, attrs);  mGestureDetector = new GestureDetector(context, new YScrollDetector());  }  @Override  public boolean onInterceptTouchEvent(MotionEvent ev) {  return super.onInterceptTouchEvent(ev)  && mGestureDetector.onTouchEvent(ev);  }  class YScrollDetector extends SimpleOnGestureListener {  @Override  public boolean onScroll(MotionEvent e1, MotionEvent e2,  float distanceX, float distanceY) {  /**  * 如果我们滚动更接近水平方向,返回false,让子视图来处理它  */   return (Math.abs(distanceY) > Math.abs(distanceX));  }  }  }

此ScrollView同样适用于ScrollView中ListView等其他View无法滚动。

2、上述解决方式在包含listview+viewpager+ScrollView时,有bug。这种情况,需重写ListView(参考之前的博客)和ScrollView:

public class ScrollViewExtend extends ScrollView {      // 滑动距离及坐标      private float xDistance, yDistance, xLast, yLast;        public ScrollViewExtend(Context context, AttributeSet attrs) {          super(context, attrs);      }        @Override      public boolean onInterceptTouchEvent(MotionEvent ev) {          switch (ev.getAction()) {              case MotionEvent.ACTION_DOWN:                  xDistance = yDistance = 0f;                  xLast = ev.getX();                  yLast = ev.getY();                  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(xDistance > yDistance){                      return false;                  }            }            return super.onInterceptTouchEvent(ev);      }  } 



0 0
原创粉丝点击