Android 开源项目浅读-------SwipeMenuListView-重写,第七章,菜单停留和暂停响应

来源:互联网 发布:2017七天网络成绩查询 编辑:程序博客网 时间:2024/05/01 13:16

这一个章节实现菜单的停留和当一个菜单打开时候,其它菜单暂停打开响应。

实现菜单停留其实很简单,就是当手指弹起来的时候判断滑动的距离就行了。修改SwipeMenuLayout类里面的哦你Swipe函数中ACTION_UP响应,另外参考源码修改一下mMenuView.layout函数的坐标,就可以实现了。

          case MotionEvent.ACTION_UP:                Log.i(TAG, "Action up");                if(Math.abs(event.getX() - mDownX)>mMenuView.getWidth()/2){                    mContentView.layout(0, 0, getMeasuredWidth(), mContentView.getMeasuredHeight());                    mMenuView.layout(getMeasuredWidth()- mMenuView.getWidth(), 0, getMeasuredWidth(),mContentView.getBottom());                }else {                    mOpenScroller.startScroll((int)event.getX(),0,this.getWidth()-(int)event.getX(), 0,1000);                    mContentView.layout(0,0,getMeasuredWidth(), mContentView.getMeasuredHeight());                }                    

如果出现mMenuView的宽带是屏幕宽度,请在onMeasure里面添加源码

    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        Log.i(TAG, "onMeasure " + mMenuView.getWidth() + " , mMenuView getMeasuredWidth is"                + mMenuView.getMeasuredWidth());        mMenuView.measure(MeasureSpec.makeMeasureSpec(600,                MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(                getMeasuredHeight(), MeasureSpec.EXACTLY));    }

接下来实现当一个菜单打开时候,其它菜单不响应。这个做的话,就是加个标志变量state,大家可以参考一下源码中的state变量,在ACITON_UP之后就设置state的状态。

   private static final int STATE_CLOSE = 0;    private static final int STATE_OPEN = 1;    private int state = STATE_CLOSE;        public  boolean isOpen(){        return  state == STATE_OPEN;    }

   case MotionEvent.ACTION_UP:                Log.i(TAG, "Action up");                if(Math.abs(event.getX() - mDownX)>mMenuView.getWidth()/2){                    state = STATE_OPEN;                    mContentView.layout(0, 0, getMeasuredWidth(), mContentView.getMeasuredHeight());                    mMenuView.layout(getMeasuredWidth()- mMenuView.getWidth(), 0, getMeasuredWidth(),mContentView.getBottom());                }else {                    state = STATE_CLOSE;                    mOpenScroller.startScroll((int)event.getX(),0,this.getWidth()-(int)event.getX(), 0,1000);                    mContentView.layout(0,0,getMeasuredWidth(), mContentView.getMeasuredHeight());                }                            //postInvalidate();              //  mMenuView.layout(getMeasuredWidth(), 0 , getMeasuredWidth()+ mMenuView.getMeasuredWidth(), mMenuView.getBottom());                break;


在SwipeMenuListView的ACTION_DOWM里面会判断这个值。

 case MotionEvent.ACTION_DOWN:                int oldPosition = mTouchPosition;                Log.i(TAG, "Action Down");                if(mTouchView != null && mTouchView.isOpen() ){                    return  true;                }                mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());                view =  getChildAt(mTouchPosition - getFirstVisiblePosition());                if(view instanceof  SwipeMenuLayout){                    mTouchView =(SwipeMenuLayout)view;                    mTouchView.setPosition(mTouchPosition);                    mTouchView.onSwipe(ev);                }

  最终效果如图





点击下载

0 0
原创粉丝点击