轉轉請注明出處 http://blog.csdn.net/u011510784/article/details/51524900
自定義可拖拽的GridView,如圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TOyATMzYDN0EDOyUDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
自定義可以拖拽的Gridview,繼承 Gridview:
public class DraggableGridView extends GridView {
public DraggableGridView(Context context) {
super(context);
this.mContext = context;
}
public DraggableGridView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
}
}
重寫 onInterceptTouchEvent(MotionEvent ev) 方法
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// 攔截按下動作
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
return setOnItemLongClickListener(ev);
}
return super.onInterceptTouchEvent(ev);
}
處理長按時間:
public boolean setOnItemLongClickListener(final MotionEvent ev) {
this.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
。。。
return false;
};
});
return super.onInterceptTouchEvent(ev);
}
這裡主要操作是記錄長按的位置,并将長按的那個ItemView懸浮顯示,主要代碼:
int offset=5;
ViewGroup itemView = (ViewGroup) getChildAt(dragPosition- getFirstVisiblePosition());
itemView.destroyDrawingCache();
itemView.setDrawingCacheEnabled(true);
itemView.setDrawingCacheBackgroundColor(0xff6DB7ED);
Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache(true));
Bitmap bitmap = Bitmap.createBitmap(bm, 0, 0,
bm.getWidth() - offset, bm.getHeight() - offset);
startDrag(bitmap, x, y);
private void startDrag(Bitmap bm, int x, int y) {
stopDrag();
windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP | Gravity.LEFT;
windowParams.x = dragItemView.getLeft();
windowParams.y = dragItemView.getTop()
+ (int) (45 * Configure.screenDensity);
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.alpha = 0.8f;
ImageView iv = new ImageView(getContext());
iv.setImageBitmap(bm);
windowManager = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);
// 把影像ImagView添加到目前視圖中
windowManager.addView(iv, windowParams);
dragImageView = iv;
}
然後監聽滑動事件,并相應的顯示移動的動畫效果,然後在手指擡起時結束整個過程,重新整理布局:
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (dragImageView != null
&& dragPosition != AdapterView.INVALID_POSITION) {
// 控制父控件攔截事件
getParent().requestDisallowInterceptTouchEvent(true);
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
if (!isCountXY) {
// 移動到哪個位置
xtox = x - mLastX;
ytoy = y - mLastY;
isCountXY = true;
}
onDrag(x, y);
if (!isMoving)
onMove(x, y);
break;
case MotionEvent.ACTION_UP:
stopDrag();
onDrop(x, y);
break;
}
}
return super.onTouchEvent(ev);
}
onDrag()方法用來根據手指的滑動來動态滑動我們在上面建立的那個ItemView:
private void onDrag(int x, int y) {
// 計算位置,通過windowManager不停地更新View
if (dragImageView != null) {
windowParams.alpha = 0.8f;
windowParams.x = (x - mLastX - xtox) + dragItemView.getLeft();
windowParams.y = (y - mLastY - ytoy) + dragItemView.getTop() + 200
+ (int) (45 * Configure.screenDensity);
windowManager.updateViewLayout(dragImageView, windowParams);
}
}
onMove()方法用來根據手指滑動來動态滑動Gridview中的item,并且通過OnDragChangedListener接口通知Adapter進行相應的資料重新整理。
更具體的代碼實作請看源碼:
源碼下載下傳