《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   添加开源实现链接

Android 滑动侧边栏(Sliding Menu)第一种实现 - 2 手动滚动+自动滚动 + 事件处理相关推荐

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

    之前的分析与一种解决方案,当前例子未充分考虑处理Touch事件,之后会接着完善例子. <Android 滑动侧边栏(Sliding Menu)实现分析> <Android 滑动侧边栏 ...

  2. android 特殊屏幕适配,Android屏幕适配(2)常见:第一种

    前言: Android屏幕适配(1)基础知识篇 Android屏幕适配(3)常见:第二种 Android屏幕适配(4)常见:第三种 Android屏幕适配(5)常见:归纳总结 常见的屏幕配置问题(一些 ...

  3. Android RecyclerView +SnapHelper 实现横向滚动自动滚动到中心控件并选中

    效果图 此效果已被产品砍掉,所以有些适配bug就不修改了 此博客只为记录下代码 默哀3秒 1秒 2秒 3秒 代码 布局文件 <?xml version="1.0" encod ...

  4. html div 自动滚动到底部,javascript让DIV的滚动自动滚动到最底部-4种方法

    要制作一个在线聊天的程序,在做最后的修饰时,需要对获得的信息即时滚动以保证用户总能看到最新消息. 聊天程序是基于AJAX设计的,没有用框架,消息容器是一个DIV,所以问题就在于如何控制DIV的滚动条. ...

  5. android tabpageindicator 参数,Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)...

    Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结.目前写了: 1.传统的ViewPager实现 2.FragmentManager+Fragment实现 3.V ...

  6. android开发歌词滑动效果_android实现歌词自动滚动效果

    最近在做Android 的MP3播放的项目,要实现歌词的自动滚动,以及同步显示. lyric的歌词解析主要用yoyoplayer里面的,显示部分参考了这里 ,这里只是模拟MP3歌词的滚动. 先上一下效 ...

  7. android实现歌词的自动滚动

    最近在做android 的MP3播放的项目,要实现歌词的自动滚动,以及同步显示. lyric的歌词解析主要用yoyoplayer里面的, 显示部分参考了http://ishelf.iteye.com/ ...

  8. Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity

    一.在xml 中设置按键的onClick 绑定的函数 新建一个工程 然后在相关的页面添加一个Button 运行一下 实际上,现在这个按键一,我们去运行的时候,他是没有任何的反馈的,我们按完它,他没有任 ...

  9. android侧边栏功能,Android实现滑动侧边栏

    在Android应用开发中,滑动侧边栏经常使用,今天我也试着自己进行了一个简单的实践,虽然功能还不是很强大,但是可以保留下来为以后的开发使用,有需要时在进行简单的修改.实现一个滑动侧边栏思路也很简单: ...

最新文章

  1. 电脑如何恢复声音_电脑文件剪切丢失如何恢复?99%数据都能恢复
  2. linux vnc的小黑点和鼠标不同步_公欲善其事 | VNC的安装和使用
  3. Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%
  4. 《Spring Recipes》第二章笔记:Creating Beans by Invokin...
  5. 浅析Linux Kernel 哈希路由表实现(一)
  6. CSS2.1 盒模型
  7. css表示屏幕宽度和高度
  8. 苹果sf字体_原来苹果偷偷爱了这些字体
  9. 2017 Multi-University Training Contest - Team 3 Kanade's trio(字典树+组合数学)
  10. 织梦dede仿站模板标签大全(最全)附带仿站工具
  11. 图灵科普数学宝藏书单|购书狂欢618倒计时,这份书单闭眼入
  12. 【Google】谷歌搜索高级用法:包括指定文件类型
  13. c++编写断点续传和多线程下载模块【转】
  14. VSCode插件之Beautify
  15. Win7怎么进入安全模式改密码
  16. pandas计算方差,平均值,分位数,中位数
  17. 【预言】鲁迅名言一百年
  18. FPGA双口RAM使用
  19. php根据生日算指定时间年龄,php根据生日计算年龄/生肖/星座实例
  20. python 学习快速入门

热门文章

  1. OKR:Objectives and Key Results目标和主要成果管理方法的知识点摘要
  2. 烹饪专业的计算机课程,烹饪专业培养目标、课程设置及教学计划
  3. 高级筛选系别计算机,一级上机Excel题库
  4. PCB制板流程及工艺
  5. java dao层代码生成器_实际开发中 dao、entity的代码怎样自动生成?一款工具送给你...
  6. unity:Enemy的简单移动
  7. Android程序闪退解决思路
  8. 新歌 wuha之《武汉》
  9. 2018html游戏引擎,技术驱动未来!全球知名游戏引擎巨头Unity确认参展2019 ChinaJoy...
  10. C#程序设计_计程车车费