Android 开源项目浅读-------SwipeMenuListView-重写,第五章,滑动弹出,放手关闭功能实现

来源:互联网 发布:金牛考勤软件数据库 编辑:程序博客网 时间:2024/05/17 21:44

前面的章节实现了滑动时候第一个选项移动的功能。那么我们要实现滑动那个项目就移动那个项目的功能。其实这个功能很简单,就是在SwipeMenuListView的onTouchEvent函数里将移动分给正确的SwipeMenuLayout对象。采用positionToPosition函数实现,代码如下。

  @Override    public boolean onTouchEvent(MotionEvent ev) {        View view;        switch (ev.getAction()){            case MotionEvent.ACTION_DOWN:               // mDownX = ev.getX();            //    mDownY = ev.getY();                Log.i(TAG, "Action Down");            //    Log.i(TAG, "down x is "+mDownX + "  down y is "+ mDownY);                break;            case MotionEvent.ACTION_MOVE:               float dx=Math.abs(mDownX- ev.getX());                float dy = Math.abs(mDownY - ev.getY());              //  Log.i(TAG, "on touch move x "+ev.getX() +" y "+ev.getY());               // Log.i(TAG, "dx "+dx+" dy "+dy);                if(dx > MAX_X){                 //   Log.i(TAG, "enough offset!");                }                mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());                 view =  getChildAt(mTouchPosition - getFirstVisiblePosition());                 if(view instanceof  SwipeMenuLayout){                    mTouchView =(SwipeMenuLayout)view;                    mTouchView.onSwipe(ev);                }                Log.i(TAG,"Action Move");            break;             //   return  true;            case MotionEvent.ACTION_UP:                Log.i(TAG, "ACtion Up");                mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());                view =  getChildAt(mTouchPosition - getFirstVisiblePosition());                if(view instanceof  SwipeMenuLayout){                   mTouchView =(SwipeMenuLayout)view;                    mTouchView.onSwipe(ev);               }             break;            default:                break;        }        return super.onTouchEvent(ev);    }}

通过上述代码就可以实现该功能了。


上面会出现当你滑动出一个item范围外,会导致其它项目滑动。为了解决这个问题,我们必须记录下按下时候的item位置,当滑动出这个位置时候不响应。首先在SwipeMenuLayout添加一个记录position的变量,添加getter和setter方法。另外修改SwipeMenuListView的OnTouchEvent响应,记录按下时候的位置,在Move里面判断是否出界代码如下。

    @Override    public boolean onTouchEvent(MotionEvent ev) {        View view;        switch (ev.getAction()){            case MotionEvent.ACTION_DOWN:                int oldPosition = mTouchPosition;                Log.i(TAG, "Action Down");                mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());                view =  getChildAt(mTouchPosition - getFirstVisiblePosition());                if(view instanceof  SwipeMenuLayout){                    mTouchView =(SwipeMenuLayout)view;                    mTouchView.setPosition(mTouchPosition);                }                break;            case MotionEvent.ACTION_MOVE:               float dx=Math.abs(mDownX- ev.getX());                float dy = Math.abs(mDownY - ev.getY());                mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());                if(mTouchPosition != mTouchView.getPosition())                {                    break;                }                if(dx > MAX_X){                 //   Log.i(TAG, "enough offset!");                }                 if(mTouchView != null){                    mTouchView.onSwipe(ev);                }                Log.i(TAG,"Action Move");            break;             //   return  true;            case MotionEvent.ACTION_UP:                Log.i(TAG, "ACtion Up");                if(mTouchView != null){                    mTouchView.onSwipe(ev);               }             break;            default:                break;        }        return super.onTouchEvent(ev);    }


这样再滑动就不会出现滑动一次,两个项目会动。

下面来实现菜单隐藏,滑动出现的功能。其实这个应该很简单,我们只须在没有触摸的时候画到屏幕外面,滑动时候画到屏幕内来。


0 0