在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自身可以处理上下滑动。

@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {Log.d(TAG, "onInterceptTouchEvent-slop:"+mTouchSlop);final int action = ev.getAction();if ((action == MotionEvent.ACTION_MOVE) && (mTouchState != TOUCH_STATE_REST)){return true;}final float x = ev.getX();final float y = ev.getY();switch (action){case MotionEvent.ACTION_MOVE:final int xDiff = (int)Math.abs(mLastMotionX-x);if (xDiff>mTouchSlop){mTouchState = TOUCH_STATE_SCROLLING;}break;case MotionEvent.ACTION_DOWN:mLastMotionX = x;mLastMotionY = y;mTouchState = mScroller.isFinished()? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;break;case MotionEvent.ACTION_CANCEL:case MotionEvent.ACTION_UP:mTouchState = TOUCH_STATE_REST;break;}return mTouchState != TOUCH_STATE_REST;}

更多相关文章

  1. android自带的下拉刷新控件SwipeRefreshLayout
  2. 流程图控件GoJS内置GraphObject类各指数介绍(二)
  3. 如何美化android程序:自定义ListView背景
  4. Android(安卓)Viewpager与WebView轮播滑动冲突的解决方案
  5. 使EditText不自动获取焦点(Android中系统输入法不主动弹出)
  6. Android上实现仿IOS弹性ScrollView
  7. 一个方便集成的 Android(安卓)右滑返回上级 控件
  8. Android(安卓)GridLayout 动态添加子控件 + 平均分配空间
  9. Android番外篇——XML layout与CSS 转载

随机推荐

  1. Android(安卓)- MediaPlayer
  2. 整理出来的一些Android基础知识
  3. Google Android(安卓)admob
  4. android 中让activity全屏幕显示
  5. msm8916 lcd 相关调试点指导
  6. Android开发神贴整理
  7. Android多媒体开发(2)————使用Android(
  8. Android加速度传感器实现“摇一摇”,带手
  9. Android(安卓)Timer的使用
  10. Android客户端与云服务器进行网络通信