长按拖拽item并实现变更排序;
安卓默认长按时间间隔500ms。
说明: WindowManager在addView时尚未测量完成, 获取宽高都是0。 可以这样测量:
view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int width = view.getMeasuredWidth();
使用getViewTreeObserver().addOnGlobalLayoutListener是布局完成后可以获取宽高;
public class DragListView extends ListView {
private WindowManager.LayoutParams windowParams;
private WindowManager windowManager;
private ImageView dragImageView;
private int offsetScreenTop; //距离屏幕顶部的位置
private int offsetViewTop; //手指按下位置距离item顶部的位置
private int dragPosition;
//上次点击按下的坐标
private int mLastMotionX, mLastMotionY;
private final int TOUCH_SLOP = 20;
private Runnable mLongPressRunnable;
private Bitmap mCurItemBmp;
//当前是否长按状态
private boolean mIsLongTouch;
public DragListView(Context context) {
super(context);
}
public DragListView(Context context, AttributeSet attrs) {
super(context, attrs);
mLongPressRunnable = new Runnable() {
@Override public void run() {
mIsLongTouch = true;
startDrag(mCurItemBmp, mLastMotionY);
}
};
}
//itemview里有view处理点击事件时, 当前ListView无法收到UP或CANCEL消息
@Override public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_