Android 滑动侧边栏(Sliding Menu)第一种实现 - 2 手动滚动+自动滚动 + 事件处理
《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 手动滚动+自动滚动 + 事件处理相关推荐
- Android 滑动侧边栏(Sliding Menu)第一种实现 - 1 手动滚动+自动滚动
之前的分析与一种解决方案,当前例子未充分考虑处理Touch事件,之后会接着完善例子. <Android 滑动侧边栏(Sliding Menu)实现分析> <Android 滑动侧边栏 ...
- android 特殊屏幕适配,Android屏幕适配(2)常见:第一种
前言: Android屏幕适配(1)基础知识篇 Android屏幕适配(3)常见:第二种 Android屏幕适配(4)常见:第三种 Android屏幕适配(5)常见:归纳总结 常见的屏幕配置问题(一些 ...
- Android RecyclerView +SnapHelper 实现横向滚动自动滚动到中心控件并选中
效果图 此效果已被产品砍掉,所以有些适配bug就不修改了 此博客只为记录下代码 默哀3秒 1秒 2秒 3秒 代码 布局文件 <?xml version="1.0" encod ...
- html div 自动滚动到底部,javascript让DIV的滚动自动滚动到最底部-4种方法
要制作一个在线聊天的程序,在做最后的修饰时,需要对获得的信息即时滚动以保证用户总能看到最新消息. 聊天程序是基于AJAX设计的,没有用框架,消息容器是一个DIV,所以问题就在于如何控制DIV的滚动条. ...
- android tabpageindicator 参数,Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)...
Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结.目前写了: 1.传统的ViewPager实现 2.FragmentManager+Fragment实现 3.V ...
- android开发歌词滑动效果_android实现歌词自动滚动效果
最近在做Android 的MP3播放的项目,要实现歌词的自动滚动,以及同步显示. lyric的歌词解析主要用yoyoplayer里面的,显示部分参考了这里 ,这里只是模拟MP3歌词的滚动. 先上一下效 ...
- android实现歌词的自动滚动
最近在做android 的MP3播放的项目,要实现歌词的自动滚动,以及同步显示. lyric的歌词解析主要用yoyoplayer里面的, 显示部分参考了http://ishelf.iteye.com/ ...
- Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity
一.在xml 中设置按键的onClick 绑定的函数 新建一个工程 然后在相关的页面添加一个Button 运行一下 实际上,现在这个按键一,我们去运行的时候,他是没有任何的反馈的,我们按完它,他没有任 ...
- android侧边栏功能,Android实现滑动侧边栏
在Android应用开发中,滑动侧边栏经常使用,今天我也试着自己进行了一个简单的实践,虽然功能还不是很强大,但是可以保留下来为以后的开发使用,有需要时在进行简单的修改.实现一个滑动侧边栏思路也很简单: ...
最新文章
- 电脑如何恢复声音_电脑文件剪切丢失如何恢复?99%数据都能恢复
- linux vnc的小黑点和鼠标不同步_公欲善其事 | VNC的安装和使用
- Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%
- 《Spring Recipes》第二章笔记:Creating Beans by Invokin...
- 浅析Linux Kernel 哈希路由表实现(一)
- CSS2.1 盒模型
- css表示屏幕宽度和高度
- 苹果sf字体_原来苹果偷偷爱了这些字体
- 2017 Multi-University Training Contest - Team 3 Kanade's trio(字典树+组合数学)
- 织梦dede仿站模板标签大全(最全)附带仿站工具
- 图灵科普数学宝藏书单|购书狂欢618倒计时,这份书单闭眼入
- 【Google】谷歌搜索高级用法:包括指定文件类型
- c++编写断点续传和多线程下载模块【转】
- VSCode插件之Beautify
- Win7怎么进入安全模式改密码
- pandas计算方差,平均值,分位数,中位数
- 【预言】鲁迅名言一百年
- FPGA双口RAM使用
- php根据生日算指定时间年龄,php根据生日计算年龄/生肖/星座实例
- python 学习快速入门
热门文章
- OKR:Objectives and Key Results目标和主要成果管理方法的知识点摘要
- 烹饪专业的计算机课程,烹饪专业培养目标、课程设置及教学计划
- 高级筛选系别计算机,一级上机Excel题库
- PCB制板流程及工艺
- java dao层代码生成器_实际开发中 dao、entity的代码怎样自动生成?一款工具送给你...
- unity:Enemy的简单移动
- Android程序闪退解决思路
- 新歌 wuha之《武汉》
- 2018html游戏引擎,技术驱动未来!全球知名游戏引擎巨头Unity确认参展2019 ChinaJoy...
- C#程序设计_计程车车费