@Override public boolean onTouchEvent(MotionEvent event) { if (dragging) { // doTask = false; int action = event.getAction(); // downHeight = getHeight() - itemHeight; switch (action) { case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: dragging = false; if (currentPosView != null) currentPosView.setBackgroundDrawable(null); // currentPosView.setBackgroundColor(0x00ffffff); stopDrag(); // Log.d(tag, "stop " + dragCurPos); if (dropOutListener != null && (event.getY() < 0 || (event.getY() + getTop()) > getBottom()) || dragCurPos == DDGridView.INVALID_POSITION) { dropOutListener.dropOut(dragItemFrom, (int) event.getX(), (int) event.getY()); } else if (dropListener != null && dragCurPos < getCount() && dragCurPos >= 0) { dropListener.drop(dragItemFrom, dragCurPos); } break; case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: int x = (int) event.getX(); int y = (int) event.getY(); dragView(x, y); int itemnum = pointToPosition(x, y); if (itemnum == INVALID_POSITION) { dragCurPos = itemnum; break; } if (itemnum != dragCurPos && currentPosView != null) { currentPosView.setBackgroundDrawable(null); // currentPosView.setBackgroundColor(0x00ffffff); } currentPosView = getChildAt(itemnum - getFirstVisiblePosition()); if (currentPosView != null) currentPosView.setBackgroundResource(R.drawable.list_drag_background); if ((action == MotionEvent.ACTION_DOWN || itemnum != dragCurPos)) { if (dragListener != null) { dragListener.drag(dragCurPos, itemnum, action == MotionEvent.ACTION_DOWN); } dragCurPos = itemnum; } int viewHeight = getHeight() / 6; if (y >= viewHeight * 5) { if (itemnum == getCount() - 1) { doTask = false; break; } downing = true; doTask = true; sendMessage(); } else if (y <= viewHeight) { if (itemnum == 0) { doTask = false; break; } downing = false; doTask = true; sendMessage(); } else { doTask = false; ha.removeMessages(0); } break; } return true; } return super.onTouchEvent(event); }