Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换

时间:2022-07-02 14:50:11

点击打开链接



修复点击空白处滑动crash的bug.


    case MotionEvent.ACTION_MOVE:


            if (mDragPosition == AdapterView.INVALID_POSITION) {
                return super.dispatchTouchEvent(ev);
            }
            int moveX = (int) ev.getX();
            int moveY = (int) ev.getY();


            //如果我们在按下的item上面移动,只要不超过item的边界我们就不移除mRunnable
            if (!isTouchInItem(mStartDragItemView, moveX, moveY)) {
                mHandler.removeCallbacks(mLongClickRunnable);
            }
            break;
        case MotionEvent.ACTION_UP:
            if (mDragPosition == AdapterView.INVALID_POSITION) {
                return super.dispatchTouchEvent(ev);
            }
            mHandler.removeCallbacks(mLongClickRunnable);
            mHandler.removeCallbacks(mScrollRunnable);
            break;
        }
        return super.dispatchTouchEvent(ev);
    }


    //用来处理是否为长按的Runnable
    private Runnable mLongClickRunnable = new Runnable() {


        @Override
        public void run() {
            isDrag = true; //设置可以拖拽
            mVibrator.vibrate(50); //震动一下


            if (mStartDragItemView != null) {
                mStartDragItemView.setVisibility(View.INVISIBLE);//隐藏该item


                //根据我们按下的点显示item镜像
                createDragImage(mDragBitmap, mDownX, mDownY);
            }


        }
    };