f(event.getAction()==MotionEvent.ACTION_MOVE) ? ? { ? ? ? ? if(wantToScrollText)//当前想滚动显示文本 ? ? ? ? ? ? return false; ? ? ? ? ? xMove=event.getRawX();? ? ? ? ? ? yMove=event.getRawY();? ? ? ? ? if(menuIsShow){ ? ? ? ? ? ? isScrollToShowMenu(); ? ? ? ? ? ? return true; ? ? ? ? } ? ? ? ? if(!oneFucction) ? ? ? ? { ? ? ? ? ? ? oneFucction=true; ? ? ? ? ? ? //这个if只能被调用一次 ? ? ? ? ? if(Math.abs(xDown-xMove)? ? ? ? ? ? ? { ? ? ? ? ? ? ? wantToScrollText=true; ? ? ? ? ? ? ? return false; ? ? ? ? ? ? ? }? ? ? ? ? }? ? ? ? ? ? isScrollToShowMenu(); ? ? } ? ? ? ? ? else if(event.getAction()==MotionEvent.ACTION_UP)? ? ? ? { ? ? ? ? oneFucction=false; ? ? ? ? if(wantToScrollText){ ? ? ? ? ? wantToScrollText=false; ? ? ? ? ? return false; ? ? ? ? }? ? ? ? ? ? ? ? xUp=event.getRawX(); ? ? ? ? ? isShowMenu(); ? ? ? ? ? releaseVelocityTracker();? ? ? } ? ? ? ? ? else if (event.getAction()==MotionEvent.ACTION_CANCEL) ? ? {? ? ? ? ? ? ? ? ? releaseVelocityTracker(); ? ? ? ? ? return false; ? ? } ? ? ? return true;//false时才能把触摸事件再传给scroll ? } ? /** ? * 根据手指按下的距离,判断是否滚动显示菜单 ? */ ? 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 rele |