本文共 2718 字,大约阅读时间需要 9 分钟。
android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 当 TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由
让子先处理的方法是 从写父的onInterceptTouchEvent事件并返回false
public boolean onInterceptTouchEvent(MotionEvent ev) {
所以,如果我们最外面是一个ScrollView,里面又有一个Viewpager或者水平滑动的广告,这个时候默认他们就会产生冲突,当你在子View上水平滑动,如果不是非常标准的水平滑动,就会使外面的ScrollView垂直滑动,或者有跳动的感觉,这些都是滑动冲突导致的,那怎么解决呢?
按照上面的思路,最外面的ScrollView首先会接收到滑动事件,如果对这个滑动进行判断,如果是水平的话,就把这个滑动事件返回给自己的子View来出来,只有垂直滑动才给自己的onTouchEvent来处理即可,所以我们需要重写ScrollView的onInterceptTouchEvent方法,代码如下:
/** * 能够兼容ViewPager的ScrollView * @Description: 解决了ViewPager在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); }}本文参考:
http://blog.sina.com.cn/s/blog_9bb108790101aydx.html
http://glblong.blog.51cto.com/3058613/1307717
转载地址:http://woalf.baihongyu.com/