? ? //初始化菜单和内容的宽和边距 ? ? ? menuParams.width = disPlayWidth - menuPadding; ? ? ? menuParams.leftMargin = 0 - menuParams.width; ? ? ? contentParams.width = disPlayWidth; ? ? ? contentParams.leftMargin=0; ? ? ? ? ? ? ? //设置参数 ? ? ? menuLayout.setLayoutParams(menuParams); ? ? ? contentLayout.setLayoutParams(contentParams); ? ? ? ? ? } ? ? @Override ? public boolean onTouch(View v, MotionEvent event) ? { ? ? ? acquireVelocityTracker(event); ? ? ? switch (event.getAction()) ? ? ? { ? ? ? case MotionEvent.ACTION_DOWN: ? ? ? ? ? xDown=event.getRawX();? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_MOVE: ? ? ? ? ? xMove=event.getRawX();? ? ? ? ? ? ? isScrollToShowMenu(); ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_UP: ? ? ? ? ? xUp=event.getRawX();? ? ? ? ? ? ? ? ? isShowMenu(); ? ? ? ? ? releaseVelocityTracker();? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? case MotionEvent.ACTION_CANCEL:? ? ? ? ? ? releaseVelocityTracker();? ? ? ? ? ? break;? ? ? ? } ? ? ? return true; ? } ? /** ? * 根据手指按下的距离,判断是否滚动显示菜单 ? */ ? private void isScrollToShowMenu() ? { ? ? ? ? int distanceX = (int) (xMove - xDown);? ? ? ? ? ? ? if (!menuIsShow) { ? ? ? ? ? ? ? scrollToShowMenu(distanceX); ? ? ? ? }else{ ? ? ? ? ? ? ? scrollToHideMenu(distanceX); ? ? ? ? } ? } ? /** ? * 手指抬起之后判断是否要显示菜单 ? */ ? private void isShowMenu() ? { ? ? ? velocityX =getScrollVelocity(); ? ? ? if(wantToShowMenu()){ ? ? ? ? ? if(shouldShowMenu()){ ? ? ? ? ? ? ? showMenu(); ? ? ? ? ? }else{ ? ? ? ? ? ? ? hideMenu(); ? ? ? ? ? } ? ? ? } ? ? ? else if(wantToHideMenu()){ ? ? ? ? ? if(shouldHideMenu()){ ? ? ? ? ? ? ? hideMenu(); ? ? ? ? ? }else{ ? ? ? ? ? ? ? showMenu(); ? ? ? ? ? } ? ? ? }? ? ? } ? /** ? *想要显示菜单,当向右移动距离大于0并且菜单不可见 ? */ ? private boolean wantToShowMenu(){ ? ? ? return !menuIsShow&&xUp-xDown>0; ? } ? /** ? *想要隐藏菜单,当向左移动距离大于0并且菜单可见 ? */ ? private boolean wantToHideMenu(){ ? ? ? return menuIsShow&&xDown-xUp>0; ? } ? /** ? *判断应该显示菜单,当向右移动的距离超过菜单的一半或者速度超过给定值 ? */ ? private boolean shouldShowMenu(){ ? ? ? return xUp-xDown>menuParams.width/2||velocityX>SNAP_VELOCITY; ? } ? /** ? *判断应该隐藏菜单,当向左移动的距离超过菜单的一半或者速度超过给定值 ? */ ? private boolean shouldHideMenu(){ ? ? ? return xDown-xUp>menuParams.width/2||velocityX>SNAP_VELOCITY; ? } ? /** ? * 显示菜单栏 ? */ ? private void showMenu() ? { ? ? ? new showMenuAsyncTask().execute(50); ? ? ? menuIsShow=true; ? } ? /** ? * 隐藏菜单栏 ? */ ? private void hideMenu() ? { ? ? new showMenuAsyncTask().execute(-50); ? ? menuIsShow=false; ? } ? /** ? *指针按着时,滚动将菜单慢慢显示出来 ? *@param scrollX 每次滚动移动的距离 ? */ ? private void scrollToShowMenu(int scrollX) ? { ? ? ? if(scrollX>0&&scrollX<= menuParams.width) ? ? ? menuParams.leftMargin =-menuParams.width+scrollX; ? ? ? menuLayout.setLayoutParams(menuParams);? ? } ? /** ? *指针按着时,滚动将菜单慢慢隐藏出来 ? *@param scrollX 每次滚动移动的距离 ? */ ? private void scrollToHideMenu(int scrollX) ? { ? ? ? if(scrollX>=-menuParams.width&&scrollX<0) ? ? ? menuParams.leftMargin=scrollX; ? ? ? menuLayout.setLayoutParams(menuParams);? ? } ? ? ? ? ? /**? ? * 创建VelocityTracker对象,并将触摸content界面的滑动事件加入到VelocityTracker当中。? ? * @param event 向VelocityTracker添加MotionEvent? ? */? ? private void acquireVelocityTracker(final MotionEvent event) {? ? ? ? if(null == mVelocityTracker) {? ? ? ? ? ? mVelocityTracker = VelocityTracker.obtain();? ? ? ? }? ? ? ? mVelocityTracker.addMovement(event);? ? }? ? /**? ? * 获取手指在content界面滑动的速度。? ? * @return 滑动速度,以每秒钟移动了多少像素值为单位。? ? */? ? private int getScrollVelocity() {? ? ? ? mVelocityTracker.computeCurrentVelocity(1000);? ? ? ? int velocity = (int) mVelocityTracker.getXVelocity();? ? ? ? ? ? return Math.abs(velocity);? ? }? ? /**? ? * 释放VelocityTracker? ? */? ? private void release |