设为首页 加入收藏

TOP

Android侧边栏的自定义实现(附源码)(二)
2015-02-25 16:15:11 来源: 作者: 【 】 浏览:83
Tags:Android 侧边 定义 实现 源码
? ? //初始化菜单和内容的宽和边距
? ? ? 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
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android仿UC浏览器左右上下滚动功.. 下一篇jQuery实现相同内容合并单元格

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: