android边栏菜单<上下左右四个方向>

背景:项目中应用到边菜单栏,开源项目SlidingMenu有点大,项目中用不到这么多东东.

功能:可以在上下左右四个方向上显示侧边栏

效果图(就截一个图,其它图放上去太多了,不太好):

关键性代码:

 a.初始化时位置处理

		/**
		 * 左边栏的属性初始化
		 */
		protected void menuLeftProperties() {
			M_LAYOUT_POSITION = ISMENU_OPEN ? 0 : -MENU_WIDTH;
			//当打开时,右边的移动。理解:保持画布不动,视图区移动
			M_SLIDER_MAX_OPEN = ISMENU_OPEN ? 0 : -MENU_WIDTH;
			//当移动时左边的移动
			M_SLIDER_MAX_CLOSE = ISMENU_OPEN ? MENU_WIDTH : 0 ;
			//偏移位置
			mMovePosition = ISMENU_OPEN ? 0 : -MENU_WIDTH;
		}
 
/**
 * 右边栏的属性初始化
 */
protected void menuRightProperties() {
	M_LAYOUT_POSITION  = ISMENU_OPEN ?  -MENU_WIDTH : 0;
	//打开时
	M_SLIDER_MAX_OPEN = ISMENU_OPEN ? 0  : MENU_WIDTH;
	//关闭时
	M_SLIDER_MAX_CLOSE = ISMENU_OPEN ? -MENU_WIDTH : 0;
	//偏移位置
	mMovePosition = ISMENU_OPEN ? 0 : MENU_WIDTH;
}
    b.消息是否拦截 
		/**
		 * 判断是否需要处理事件
		 * 
		 * @param ev
		 * @return
		 */
		protected boolean isInterceptTouchEvent(MotionEvent ev) {
			boolean isIntercept = false;
			switch (MENU_POSITION) {
			case LEFT:
				isIntercept = isInterceptMenuLeftTouchEvent(ev);
				break;
			case RIGHT:
				isIntercept = isInterceptMenuRightTouchEvent(ev);
				break;
			case TOP:
				isIntercept = isInterceptMenuTopTouchEvent(ev);
				break;
			case BOTTOM:
				isIntercept = isInterceptMenuBottomTouchEvent(ev);
				break;
			}
			return isIntercept;
		}
  
/**
  * 边栏左边是否要处理
  * @param ev
  * @return
  */
protected boolean isInterceptMenuLeftTouchEvent(MotionEvent ev) {
 //是左右滑动
 boolean isIntercept = Math.abs(ev.getY() - MOTIONEVENT_Y) <= Math.abs(ev.getX() - MOTIONEVENT_X);
return isIntercept && ((MOTIONEVENT_X >= 0 && MOTIONEVENT_X <= TOUCH_OPEN_MENU_DISTANCE
		   && !ISMENU_OPEN && (ev.getX() - MOTIONEVENT_X) > 0)
		   || (ev.getX() - MOTIONEVENT_X < 0 && ISMENU_OPEN));
}
    c.菜单栏的移动
/**
		 * 当Menu菜单在左边时
		 * @param event
		 */
		protected void menuLeftMoveEvent(MotionEvent event) {
			float distance =  event.getX() - MOTIONEVENT_X;
			//向右滑动,打开菜单栏
			if(distance > 0) {
				if(distance + mMovePosition >= 0) {
					ISMENU_OPEN = true;
					mMovePosition = 0;
					smoothScrollTo(M_SLIDER_MAX_OPEN, 0);
					return ;
				}else {
					mMovePosition += distance;
				}
			}else if(distance < 0) {
				if(distance + mMovePosition <= -MENU_WIDTH) {
					ISMENU_OPEN = false;
					mMovePosition = -MENU_WIDTH;
					smoothScrollTo(M_SLIDER_MAX_CLOSE, 0);
					return ;
				}else {
					mMovePosition += distance;
				}
			}
			smoothScrollBy((int) - distance, 0);
			MOTIONEVENT_X = event.getX();
		}

 其它一些代码都做过相应的注释 整个工程在附件中.

猜你喜欢

转载自yq135314.iteye.com/blog/1997778
今日推荐