《Android 滑动侧边栏(Sliding Menu)实现分析》

《Android 滑动侧边栏(Sliding Menu)第一种实现 - 1 手动滚动+自动滚动》

《Android 滑动侧边栏(Sliding Menu)第一种实现 - 2 手动滚动+自动滚动 + 事件处理》(本篇文章)

《Android 滑动侧边栏(Sliding Menu)第二种实现方式1》




一、 有图有真相



二、分析与伪码

1.添加onIntercepteEvent, 只有当手指在右侧视图上并且移动超过一定距离,满足这连个条件拦截交由ViewGoup执行滚动

@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {final int actioin = ev.getAction();final int x = (int) ev.getX();switch (actioin) {case MotionEvent.ACTION_DOWN:mInterceptMotionX = x;break;case MotionEvent.ACTION_MOVE:final int deltaX = x - mInterceptMotionX;final int distance = Math.abs(deltaX);// 点击区域必须在右侧视图,因为仅右侧视图可移动// 横向移动超过一定距离,可以自己根据需求改动if ( canSliding(ev) && distance > mTouchSlop * 2) {// 置为初始值mLastX = x;if (mScrollRunnable != null) {mScrollRunnable.endScroll();mScrollRunnable = null;}// 拦截Touch Event 交由当前ViewGruop onTouchEvent处理return true;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:mInterceptMotionX = 0;break;}return false;}

2. 上面用到的判断是否是右侧视图改变canSliding方法内部实现改变,使用ViewGroup.dispatchTouchEvent中判断方式。

/** * 当前手指点击位置是否在右侧视图区域内 *  * @param event * @return true 可以滚动 */private boolean canSliding(MotionEvent event) {final int scrolledXInt = (int) (event.getX() + getScrollX());final int scrolledYInt = (int) (event.getY() + getScrollY());Rect frame = new Rect();mRightView.getHitRect(frame);if (frame.contains(scrolledXInt, scrolledYInt)) {return true;}return false;}


3. 改变onTochEvent,ACTION_DOWN的处理放到onInterceptTouchEvent中了,而且ViewGroup也不需要拦截DOWN事件,所以DOWN事件从onTochEvent删除。

@Overridepublic boolean onTouchEvent(MotionEvent event) {final int x = (int) event.getX();switch (event.getAction()) {case MotionEvent.ACTION_MOVE:scrollIfNeed(x);return true;case MotionEvent.ACTION_UP:autoScrollIfNeed(x);break;}return false;}

4. scrollIfNeed方法改变,右侧视图盖住左侧视图时,隐藏左侧视图,目的是为了此时左侧视图不接收Touch Event

private void scrollIfNeed(final int x) {// 计算与上次的偏移量int deltaX = x - mLastX;// 减少移动次数if (x != mLastX) {// 显示if (mLeftView.getVisibility() != View.VISIBLE) {mLeftView.setVisibility(View.VISIBLE);}int l = mRightView.getLeft();int t = mRightView.getTop();int b = mRightView.getBottom();// 右侧视图的滑动区域,只能在左侧视图范围内滑动int rightViewLeft = Math.max(mLeftView.getLeft(), l + deltaX);rightViewLeft = Math.min(mLeftView.getRight(), rightViewLeft);// 控制随手指滑动mRightView.layout(rightViewLeft, t, rightViewLeft + mRightView.getWidth(), b);}// 滑动到最左侧if (mRightView.getLeft() == mLeftView.getLeft()) {mLeftView.setVisibility(View.INVISIBLE);}// 记录当前值供下次计算mLastX = x;}


三、完整源码下载

源码下载地址



本文只是一个待完善的DEMO,如果想更深入学习的可以看下GITHUB上的SlidingMenu实现 https://github.com/jfeinstein10/SlidingMenu


原文地址:http://blog.csdn.net/love_world_/article/details/8666210


2013-04-17 添加开源实现链接


更多相关文章

  1. android实现卸载提示
  2. android 实现静默安装、卸载(图)
  3. android中九宫格布局的实现
  4. Android之——手机黑名单的实现
  5. 【Tech-Android-Other】android中的Parcelable的实现
  6. [转]Android(安卓)实现TextView中文字链接的方式
  7. Linux通过shell脚本实现JDK版本之间的快速切换
  8. Linux通过shell脚本实现JDK版本之间的快速切换
  9. android 日常 (十六)

随机推荐

  1. Python Django模型详解
  2. 百胜公司在线
  3. 腾龙公司在线
  4. js基础语法 变量 函数
  5. fetch应用——访问JSON数据
  6. 初识JS变量与常量、函数、作用域与闭包、
  7. 华纳公司现场经理
  8. js基础知识(变量、常量、函数、数据类型
  9. Android接入USB扫码模块的方法
  10. DOM 元素的基本操作