package
com.jj.draggrid;
import
java.util.logging.Handler;
import
com.jj.draggrid.MainActivity.DragGridAdapter;
import
android.content.Context;
import
android.graphics.Bitmap;
import
android.graphics.PixelFormat;
import
android.util.AttributeSet;
import
android.util.Log;
import
android.view.Gravity;
import
android.view.MotionEvent;
import
android.view.View;
import
android.view.ViewGroup;
import
android.view.WindowManager;
import
android.widget.AdapterView;
import
android.widget.BaseAdapter;
import
android.widget.GridView;
import
android.widget.ImageView;
import
android.widget.Toast;
/***
* 自定義拖拽GridView
*
* @author zhangjia
*
*/
public
class
DragGridView
extends
GridView {
private
WindowManager windowManager;
private
WindowManager.LayoutParams windowParams;
private
int
scaledTouchSlop;
private
ImageView dragImageView;
private
int
dragSrcPosition;
private
int
dragPosition;
private
int
dragPointX;
private
int
dragPointY;
private
int
dragOffsetX;
private
int
dragOffsetY;
private
int
upScrollBounce;
private
int
downScrollBounce;
private
int
temChangId;
private
boolean
isDoTouch =
false
;
private
boolean
isHide =
false
;
private
Handler handler;
public
void
setDoTouch(
boolean
isDoTouch) {
this
.isDoTouch = isDoTouch;
}
public
DragGridView(Context context, AttributeSet attrs) {
super
(context, attrs);
}
@Override
public
boolean
onInterceptTouchEvent(MotionEvent ev) {
if
(ev.getAction() == MotionEvent.ACTION_DOWN) {
int
x = (
int
) ev.getX();
int
y = (
int
) ev.getY();
temChangId = dragSrcPosition = dragPosition = pointToPosition(x, y);
if
(dragPosition == AdapterView.INVALID_POSITION) {
return
super
.onInterceptTouchEvent(ev);
}
ViewGroup itemView = (ViewGroup) getChildAt(dragPosition
- getFirstVisiblePosition());
dragPointX = x - itemView.getLeft();
dragPointY = y - itemView.getTop();
dragOffsetX = (
int
) (ev.getRawX() - x);
dragOffsetY = (
int
) (ev.getRawY() - y);
View dragger = itemView.findViewById(R.id.drag_grid_item);
/***
* 判斷是否選中拖動圖標
*/
if
(dragger !=
null
&& dragPointX > dragger.getLeft()
&& dragPointX < dragger.getRight()
&& dragPointY > dragger.getTop()
&& dragPointY < dragger.getBottom() +
20
) {
upScrollBounce = getHeight() /
4
;
downScrollBounce = getHeight() *
3
/
4
;
itemView.setDrawingCacheEnabled(
true
);
Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
startDrag(bm, x, y);
dragger.setVisibility(View.INVISIBLE);
}
}
return
super
.onInterceptTouchEvent(ev);
}
@Override
public
boolean
onTouchEvent(MotionEvent ev) {
if
(dragImageView !=
null
&& dragPosition != INVALID_POSITION
&& isDoTouch) {
int
action = ev.getAction();
switch
(action) {
/***
*
*/
case
MotionEvent.ACTION_UP:
int
upX = (
int
) ev.getX();
int
upY = (
int
) ev.getY();
stopDrag();
onDrop(upX, upY);
break
;
/***
* 拖拽item
*
*/
case
MotionEvent.ACTION_MOVE:
int
moveX = (
int
) ev.getX();
int
moveY = (
int
) ev.getY();
onDrag(moveX, moveY);
break
;
case
MotionEvent.ACTION_DOWN:
int
downX = (
int
) ev.getX();
int
downY = (
int
) ev.getY();
onHide(downX, downY);
break
;
default
:
break
;
}
return
true
;
}
return
super
.onTouchEvent(ev);
}
/**
* 準備拖動,初始化拖動項的圖像
*
* @param bm
* @param y
*/
public
void
startDrag(Bitmap bm,
int
x,
int
y) {
windowParams =
new
WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP | Gravity.LEFT;
windowParams.x = x - dragPointX + dragOffsetX;
windowParams.y = y - dragPointY + dragOffsetY;
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
windowParams.windowAnimations =
0
;
ImageView imageView =
new
ImageView(getContext());
imageView.setImageBitmap(bm);
windowManager = (WindowManager) getContext().getSystemService(
"window"
);
windowManager.addView(imageView, windowParams);
dragImageView = imageView;
}
/***
* 拖動時時change
*/
private
void
onChange(
int
x,
int
y) {
DragGridAdapter adapter = (DragGridAdapter) getAdapter();
if
(dragPosition < getAdapter().getCount()) {
if
(dragPosition != temChangId) {
adapter.update(temChangId, dragPosition);
temChangId = dragPosition;
}
}
int
tempPosition = pointToPosition(x, y);
if
(tempPosition != INVALID_POSITION) {
dragPosition = tempPosition;
}
}
/***
* 拖動執行,在Move方法中執行
*
* @param x
* @param y
*/
public
void
onDrag(
int
x,
int
y) {
if
(dragImageView !=
null
) {
windowParams.alpha =
0
.8f;
windowParams.x = x - dragPointX + dragOffsetX;
windowParams.y = y - dragPointY + dragOffsetY;
windowManager.updateViewLayout(dragImageView, windowParams);
}
onChange(x, y);
if
(y < upScrollBounce || y > downScrollBounce) {
setSelection(dragPosition);
}
}
/***
* 隱藏該選項
*/
private
void
onHide(
int
x,
int
y) {
DragGridAdapter adapter = (DragGridAdapter) getAdapter();
int
tempPosition = pointToPosition(x, y);
if
(tempPosition != INVALID_POSITION) {
dragPosition = tempPosition;
}
adapter.setIsHidePosition(dragPosition);
}
/**
* 停止拖動,刪除影像
*/
public
void
stopDrag() {
if
(dragImageView !=
null
) {
windowManager.removeView(dragImageView);
dragImageView =
null
;
}
}
/***
* 拖動放下的時候
*
* @param x
* @param y
*/
public
void
onDrop(
int
x,
int
y) {
DragGridAdapter adapter = (DragGridAdapter) getAdapter();
adapter.setIsHidePosition(-
1
);
}
}