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

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

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

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




一、 有图有真相

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


二、分析与伪码

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

[java] view plain copy print ?
  1. @Override
  2. publicbooleanonInterceptTouchEvent(MotionEventev){
  3. finalintactioin=ev.getAction();
  4. finalintx=(int)ev.getX();
  5. switch(actioin){
  6. caseMotionEvent.ACTION_DOWN:
  7. mInterceptMotionX=x;
  8. break;
  9. caseMotionEvent.ACTION_MOVE:
  10. finalintdeltaX=x-mInterceptMotionX;
  11. finalintdistance=Math.abs(deltaX);
  12. //点击区域必须在右侧视图,因为仅右侧视图可移动
  13. //横向移动超过一定距离,可以自己根据需求改动
  14. if(canSliding(ev)&&distance>mTouchSlop*2){
  15. //置为初始值
  16. mLastX=x;
  17. if(mScrollRunnable!=null){
  18. mScrollRunnable.endScroll();
  19. mScrollRunnable=null;
  20. }
  21. //拦截TouchEvent交由当前ViewGruoponTouchEvent处理
  22. returntrue;
  23. }
  24. break;
  25. caseMotionEvent.ACTION_UP:
  26. caseMotionEvent.ACTION_CANCEL:
  27. mInterceptMotionX=0;
  28. break;
  29. }
  30. returnfalse;
  31. }

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

[java] view plain copy print ?
  1. /**
  2. *当前手指点击位置是否在右侧视图区域内
  3. *
  4. *@paramevent
  5. *@returntrue可以滚动
  6. */
  7. privatebooleancanSliding(MotionEventevent){
  8. finalintscrolledXInt=(int)(event.getX()+getScrollX());
  9. finalintscrolledYInt=(int)(event.getY()+getScrollY());
  10. Rectframe=newRect();
  11. mRightView.getHitRect(frame);
  12. if(frame.contains(scrolledXInt,scrolledYInt)){
  13. returntrue;
  14. }
  15. returnfalse;
  16. }


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

[java] view plain copy print ?
  1. @Override
  2. publicbooleanonTouchEvent(MotionEventevent){
  3. finalintx=(int)event.getX();
  4. switch(event.getAction()){
  5. caseMotionEvent.ACTION_MOVE:
  6. scrollIfNeed(x);
  7. returntrue;
  8. caseMotionEvent.ACTION_UP:
  9. autoScrollIfNeed(x);
  10. break;
  11. }
  12. returnfalse;
  13. }

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

[java] view plain copy print ?
  1. privatevoidscrollIfNeed(finalintx){
  2. //计算与上次的偏移量
  3. intdeltaX=x-mLastX;
  4. //减少移动次数
  5. if(x!=mLastX){
  6. //显示
  7. if(mLeftView.getVisibility()!=View.VISIBLE){
  8. mLeftView.setVisibility(View.VISIBLE);
  9. }
  10. intl=mRightView.getLeft();
  11. intt=mRightView.getTop();
  12. intb=mRightView.getBottom();
  13. //右侧视图的滑动区域,只能在左侧视图范围内滑动
  14. intrightViewLeft=Math.max(mLeftView.getLeft(),l+deltaX);
  15. rightViewLeft=Math.min(mLeftView.getRight(),rightViewLeft);
  16. //控制随手指滑动
  17. mRightView.layout(rightViewLeft,t,rightViewLeft+mRightView.getWidth(),b);
  18. }
  19. //滑动到最左侧
  20. if(mRightView.getLeft()==mLeftView.getLeft()){
  21. mLeftView.setVisibility(View.INVISIBLE);
  22. }
  23. //记录当前值供下次计算
  24. mLastX=x;
  25. }


三、完整源码下载

源码下载地址



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

更多相关文章

  1. (三)Android事件分发机制 - Activity篇
  2. Android界面布局——视图/容器易混淆点总结
  3. android 按钮点击的两种方法以及长按事件
  4. Android LinearLayout 嵌套 button 监听LinearLayout的onClickLi
  5. android 获取对话框关闭事件
  6. android四种不同的事件实现
  7. android双击事件
  8. Android 应用开发笔记 - 图片视图(ImageView)
  9. Android截取开机关机事件

随机推荐

  1. android wifiservice enable流程
  2. Android滑动(三)——scrollTo与scrollBy
  3. Android(安卓)Studio导入项目的几种方法
  4. 匹配联系人采用的是7位还是11位匹配
  5. android轮播图示例
  6. Android上传多张图片的实例代码(RxJava异
  7. Frame Animation 疑问,知道的请帮忙解答下
  8. 【Android(安卓)Developers Training】 7
  9. android中SQLite的操作
  10. Android(HTC G7) 安装 Hadoop 伪分布