可自由设置不能拖拽的位置,选中的位置,及拖拽的镜像样式
import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.Handler; import android.os.Vibrator; import android.support.annotation.NonNull; 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.ViewParent; import android.view.WindowManager; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; import com.dealmoon.android.R; import com.north.expressnews.home.TextViewAdapter; public class DragGridViewItemLine extends GridView { /** * DragGridView的item长按响应的时间, 默认是1000毫秒,也可以自行设置 */ private long dragResponseMS = 1000; /** * 是否可以拖拽,默认不可以 */ private boolean isDrag = false; /** * 功能设置:是否能拖拽 */ private boolean dragEnable = true; /** * 设置不能拖动的位置 * 忽略的位置,用于长按此类位置不进行移动 */ private int[] ignorePositions; private int mDownX; private int mDownY; private int moveX; private int moveY; /** * 正在拖拽的position */ private int mDragPosition; /** * 刚开始拖拽的item对应的View */ private View mStartDragItemView = null; /** * 用于拖拽的镜像,这里直接用一个ImageView */ private ImageView mDragImageView; /** * 震动器 */ private Vibrator mVibrator; private WindowManager mWindowManager; /** * item镜像的布局参数 */ private WindowManager.LayoutParams mWindowLayoutParams; /** * 我们拖拽的item对应的Bitmap */ private Bitmap mDragBitmap; /** * 按下的点到所在item的上边缘的距离 */ private int mPoint2ItemTop; /** * 按下的点到所在item的左边缘的距离 */ private int mPoint2ItemLeft; /** * DragGridView距离屏幕顶部的偏移量 */ private int mOffset2Top; /** * DragGridView距离屏幕左边的偏移量 */ private int mOffset2Left; /** * 状态栏的高度 */ private int mStatusHeight; /** * DragGridView自动向下滚动的边界值 */ private int mDownScrollBorder; /** * DragGridView自动向上滚动的边界值 */ private int mUpScrollBorder; /** * DragGridView自动滚动的速度 */ private static final int speed = 20; private boolean isNeedItemBorder = true; private int mDragItemBackground = 0; public void setNeedItemBorder(boolean needItemBorder) { isNeedItemBorder = needItemBorder; } public void setDragItemBackground(int bg) { mDragItemBackground = bg; } /** * item发生变化回调的接口 */ private OnChanageListener onChanageListener; public DragGridViewItemLine(Context context) { this(context, null); } public DragGridViewItemLine(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DragGridViewItemLine(Context context, AttributeSet attrs,