之前的分析与一种解决方案,当前例子未充分考虑处理Touch事件,之后会接着完善例子。

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

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

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

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

一、 先来看看效果图

二、实现展示

方案 具体使用 可参考之前Demo
布局 ViewGroup(左测绿色视图和右侧蓝色视图分别是其子View) 《自定义ViewGrup》
手动滚动 ViewGroup.layout(left, top, right, bottom);  《layout方法官方文档》
自动滚动  Scroller 和 ViewGroup.layout(); 《Scroller Demo》 

三、伪代码

1. 布局上面的Demo中可以找到相关Demo

2  手动滚动和自动滚动都是在onTouchEvent中进行控制,先看下源码,不喜欢贴大段的完整代码,最后会提供完整代码下载

public class SlidingMenus extends ViewGroup {private View mRightView;private View mLeftView;// 记录一次移动位置,用于计算移动偏移量private int mLastX;// 按下时记录,用于判断当前滚动时向左还是向右private int mMotionX;......@Overridepublic boolean onTouchEvent(MotionEvent event) {final int x = (int) event.getX();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX = x;mMotionX = x;boolean inRegion = canSliding(event);return inRegion;case MotionEvent.ACTION_MOVE:scrollIfNeed(x);return true;case MotionEvent.ACTION_UP:autoScrollIfNeed(x);break;}return true;}......}

3. canSliding进行判断,仅右侧视图可以滚动,左侧视图不能滚动

 /*** 只有右侧视图可以移动* * @param event* @return true 可以滚动*/private boolean canSliding(MotionEvent event) {int[] location = new int[2];// 获取右侧视图相对于屏幕坐标值mRightView.getLocationOnScreen(location);RectF region = new RectF();region.set(location[0] , location[1] ,location[0] + mRightView.getWidth(),location[1] + mRightView.getHeight());// 当前手指点击位置是否在右侧视图区域内boolean inRegion = region.contains(event.getRawX(), event.getRawY());return inRegion;}

4. 右侧视图随手指移动,具体实现方法在scrollIfNeed

 private void scrollIfNeed(final int x) {// 计算与上次的偏移量int deltaX = x - mLastX;// 减少移动次数if (x != mLastX) {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);}// 记录当前值供下次计算mLastX = x;}

5. 手指抬起后,视图随手指自动滚动具体实现在autoScrollIfNeed

 private void autoScrollIfNeed(final int x) {mScrollRunnable = new ScrollRunnable();// 用于判断滑动方向final int deltaX = x - mMotionX;// x轴向右是依次递增与手指落下点差值,小于0说明是手指向左滑动boolean moveLeft = deltaX <= 0;// 滑动距离超过左侧视图一半,才会沿着手指方向滚动final int distance = Math.abs(deltaX);if (distance < mLeftView.getWidth() / 2) {// 从哪来回哪去moveLeft = !moveLeft;}// 启动自动滚动mScrollRunnable.startScroll(moveLeft);}private class ScrollRunnable implements Runnable {// 滚动辅助类,提供起始位置,移动偏移,移动总时间,可以获取每次滚动距离private Scroller mScroller = new Scroller(getContext());@Overridepublic void run() {final Scroller scroller = mScroller;// 计算滚动偏移,返回是否可以接着滚动boolean more = scroller.computeScrollOffset();// 计算后获取需要滚动到的位置final int x = scroller.getCurrX();if (more) {// 与手动滚动调用的方法相同scrollIfNeed(x);// 当前子线程已经执行完,但是需要接着滚动// 所以把当前Runnable再次添加到消息队列中post(this);} else {// 不需要滚动endScroll();}}private void startScroll(boolean moveLeft) {// 滚动前设置初始值mLastX = mRightView.getLeft();int dx = 0;// 计算移动总距离if (moveLeft) {// 当前到左视图左侧边界距离dx = mLeftView.getLeft() - mRightView.getLeft();} else {// 到右侧边界dx = mLeftView.getRight() - mRightView.getLeft();}// 开始滚动mScroller.startScroll(mRightView.getLeft(), 0, dx, 0, 300);// 把当前Runnable添加到消息队列中post(this);}private void endScroll() {// 从消息队列中把当前Runnable删除,即停止滚动removeCallbacks(this);}}

四、完整源码下载

源码下载连接

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

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

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

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

  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. mysql 应用前景_图数据库在企业应用中前景如何,相比关系型数据库有哪些优势?...
  2. QIIME1.9.1-2使用Docker运行QIIME
  3. 解决overfitting的方法
  4. Linux~Sh脚本一点自己的总结
  5. .NET 3.5 中WCF客户端代理性能改进以及最佳实践
  6. 智能合约类代币EOS、BCH、Tezos很有可能会超越BTC
  7. 201406114331-黄智涛-OS 实验报告
  8. python详细安装教程环境配置-如何安装Python(环境设置)?详细安装步骤图解
  9. 类Unix系统下,vim各种模式之间的切换
  10. 百度feeds联盟软件测试开发,UI 自动化测试用例整理举例-百度首页
  11. eclipse xhtml文件 标签自动提示 问题解决
  12. OpenWrt项目:针对嵌入式设备的Linux操作系统
  13. C语言:编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递
  14. android中文朗读包,Android 通过手说tts中文语音包实现中文朗读
  15. bzero和memset函数
  16. Verilog描述——一位全加器,四选一选择器,计数器
  17. python---turtle库(详解)
  18. 国内主机备案是干嘛的? 国内免备案主机是真的吗?
  19. 文件系统 - 文件类型 - 二进制/文本类型
  20. Winter And Snowmen

热门文章

  1. App Store审核指南中文版(2014.9.10更新):新增Apple Pay相关内容
  2. 使用 FSL 和 TrackVis 分析 DTI 数据
  3. 行业分析-单机游戏市场现状及未来发展趋势
  4. 安装 Frida 和 Passionfruit
  5. 【canvas 图形画布标签】(使用详解)
  6. java动态规划 硬币_动态规划-硬币问题
  7. Open3D 点云粗糙度计算
  8. win10搜索框怎么关闭_怎么关闭win10笔记本电脑触摸板
  9. 进销存设计与分析_销售退货单(6)
  10. 关于keil/MDK生成pat/bin/汇编文件的方法