Android(安卓)滑动侧边栏(Sliding Menu)第一种实现 - 2 手动滚动+自动滚动 + 事件处理
16lz
2021-12-04
《Android 滑动侧边栏(Sliding Menu)实现分析》
《Android 滑动侧边栏(Sliding Menu)第一种实现 - 1 手动滚动+自动滚动》
《Android 滑动侧边栏(Sliding Menu)第一种实现 - 2 手动滚动+自动滚动 + 事件处理》(本篇文章)
《Android 滑动侧边栏(Sliding Menu)第二种实现方式1》
一、 有图有真相
二、分析与伪码
1.添加onIntercepteEvent, 只有当手指在右侧视图上并且移动超过一定距离,满足这连个条件拦截交由ViewGoup执行滚动
[java] view plain copy print ?
- @Override
- publicbooleanonInterceptTouchEvent(MotionEventev){
- finalintactioin=ev.getAction();
- finalintx=(int)ev.getX();
- switch(actioin){
- caseMotionEvent.ACTION_DOWN:
- mInterceptMotionX=x;
- break;
- caseMotionEvent.ACTION_MOVE:
- finalintdeltaX=x-mInterceptMotionX;
- finalintdistance=Math.abs(deltaX);
- //点击区域必须在右侧视图,因为仅右侧视图可移动
- //横向移动超过一定距离,可以自己根据需求改动
- if(canSliding(ev)&&distance>mTouchSlop*2){
- //置为初始值
- mLastX=x;
- if(mScrollRunnable!=null){
- mScrollRunnable.endScroll();
- mScrollRunnable=null;
- }
- //拦截TouchEvent交由当前ViewGruoponTouchEvent处理
- returntrue;
- }
- break;
- caseMotionEvent.ACTION_UP:
- caseMotionEvent.ACTION_CANCEL:
- mInterceptMotionX=0;
- break;
- }
- returnfalse;
- }
2. 上面用到的判断是否是右侧视图改变canSliding方法内部实现改变,使用ViewGroup.dispatchTouchEvent中判断方式。
[java] view plain copy print ?
- /**
- *当前手指点击位置是否在右侧视图区域内
- *
- *@paramevent
- *@returntrue可以滚动
- */
- privatebooleancanSliding(MotionEventevent){
- finalintscrolledXInt=(int)(event.getX()+getScrollX());
- finalintscrolledYInt=(int)(event.getY()+getScrollY());
- Rectframe=newRect();
- mRightView.getHitRect(frame);
- if(frame.contains(scrolledXInt,scrolledYInt)){
- returntrue;
- }
- returnfalse;
- }
3. 改变onTochEvent,ACTION_DOWN的处理放到onInterceptTouchEvent中了,而且ViewGroup也不需要拦截DOWN事件,所以DOWN事件从onTochEvent删除。
[java] view plain copy print ?
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- finalintx=(int)event.getX();
- switch(event.getAction()){
- caseMotionEvent.ACTION_MOVE:
- scrollIfNeed(x);
- returntrue;
- caseMotionEvent.ACTION_UP:
- autoScrollIfNeed(x);
- break;
- }
- returnfalse;
- }
4. scrollIfNeed方法改变,右侧视图盖住左侧视图时,隐藏左侧视图,目的是为了此时左侧视图不接收Touch Event
[java] view plain copy print ?
- privatevoidscrollIfNeed(finalintx){
- //计算与上次的偏移量
- intdeltaX=x-mLastX;
- //减少移动次数
- if(x!=mLastX){
- //显示
- if(mLeftView.getVisibility()!=View.VISIBLE){
- mLeftView.setVisibility(View.VISIBLE);
- }
- intl=mRightView.getLeft();
- intt=mRightView.getTop();
- intb=mRightView.getBottom();
- //右侧视图的滑动区域,只能在左侧视图范围内滑动
- intrightViewLeft=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;
- }
三、完整源码下载
源码下载地址
原文地址:http://blog.csdn.net/love_world_/article/details/8666210
更多相关文章
- Android界面布局——视图/容器易混淆点总结
- Android滑动手势侦测方法介绍
- ListView滚动条问题
- 仿优酷Android客户端图片左右滑动(自动滑动)
- android 图片 上下左右滑动,能放大放小
- Switch自定义
- Android7.0中文文档(API) -- Switch
- android 笔记-scrollview滑动阴影取消
- UI组件