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

前面的章节实现了滑动时候第一个选项移动的功能。那么我们要实现滑动那个项目就移动那个项目的功能。其实这个功能很简单,就是在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);
    }


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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值