listview所带来的滑动冲突

来源:互联网 发布:网络电视台广告语 编辑:程序博客网 时间:2024/05/21 14:53

From:http://blog.csdn.net/singwhatiwanna/article/details/8863232

在android中,有时候会遇到子控件和父控件都要滑动的情况,尤其是当子控件为listview的时候。这种情况较常见,典型的launcher,每个屏幕上放上listview就会出现这种情况。

有两点需要注意:

  1. 一般来说,view的onTouchEvent返回true,即消耗点击事件,viewgroup的onInterceptTouchEvent返回false,即不拦截点击事件,这一点从android源码中可以看出来。但是listview的父类AbsListView重写了onInterceptTouchEvent,返回了true,注意这里不是一定返回true,但是我觉得这一点可以先忽略。
  2. onTouchEvent和onInterceptTouchEvent的调用顺序。点击事件从父控件向子控件传递,如果父控件不拦截,则交由子控件拦截,如果父控件拦截了,则交由父控件的onTouchEvent处理,如果最终处理点击事件的控件的onTouchEvent返回了false,则将会直接调用其父控件的onTouchEvent,如此向上类推。

其实解决方法也很简单:重写父控件的onInterceptTouchEvent函数,在move的时候根据需要返回true,比如左右滑动返回true,其他情况均返回false。这样,当左右滑动的时候,由于onInterceptTouchEvent返回了true,父控件就能处理,其他情况,事件将传递到listview中,listview自身可以处理上下滑动。

[java] view plaincopy
  1. @Override  
  2. public boolean onInterceptTouchEvent(MotionEvent ev)   
  3. {  
  4.     Log.d(TAG, "onInterceptTouchEvent-slop:"+mTouchSlop);  
  5.   
  6.     final int action = ev.getAction();  
  7.     if ((action == MotionEvent.ACTION_MOVE) && (mTouchState != TOUCH_STATE_REST))  
  8.     {  
  9.         return true;  
  10.     }  
  11.   
  12.     final float x = ev.getX();  
  13.     final float y = ev.getY();  
  14.   
  15.     switch (action)  
  16.     {  
  17.     case MotionEvent.ACTION_MOVE:  
  18.         final int xDiff = (int)Math.abs(mLastMotionX-x);  
  19.         if (xDiff>mTouchSlop)  
  20.         {  
  21.             mTouchState = TOUCH_STATE_SCROLLING;  
  22.         }  
  23.         break;  
  24.   
  25.     case MotionEvent.ACTION_DOWN:  
  26.         mLastMotionX = x;  
  27.         mLastMotionY = y;  
  28.         mTouchState = mScroller.isFinished()? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;  
  29.         break;  
  30.   
  31.     case MotionEvent.ACTION_CANCEL:  
  32.     case MotionEvent.ACTION_UP:  
  33.         mTouchState = TOUCH_STATE_REST;  
  34.         break;  
  35.     }  
  36.   
  37.     return mTouchState != TOUCH_STATE_REST;  
  38. }  
0 0
原创粉丝点击