前言
这篇博客只写了拖动排序,具体的订阅功能,有需要的小伙伴也可以看下我之前写的关于订阅功能实现的一篇博文👇👇👇(写的比较早,现在有了更简便的方法,下次再写一篇新的)!
Android应用分类订阅功能(新闻个性化分类订阅)
效果图
这里可以看到,长按某个Item以后,进行拖动,可以实现将此Item拖动到该GridView中其他位置的功能
实现原理
通过实现自定义GridView重写onTouchEvent方法以及实现onItemLongClick接口来实现长按一个item然后用窗口显示出来,根据手指的移动来移动显示的窗口,最后通过判断手指离开屏幕的位置来确定最终item移动到的位置。
核心代码
DragGridView.java
首先是继承自GridView,并且实现OnItemLongClickListener接口,再重写一下onTouchEvent方法;
整体逻辑(理解万岁):
1、长按某个Item时:在onTouchEvent中获取当前手指在屏幕上的位置(记录坐标);在OnItemLongClickListener中通过获取当前Item的图像资源放入ImageView中,然后通过WindowManager窗口将这个图像方法1.2倍显示在屏幕上,并且隐藏掉长按的Item;
2、长按以后拖动时:让Windowmanager窗口随着手指移动,并且判断移动的过程中有没有移动到别的Item上,如果有那就进行排序;
3、停止操作以后:将隐藏掉的Item显示回来,并且调用WindowManager的.removeView()
方法移除ImageView图像
这里该写的注释基本上都写了,这里面有几个Adapter里面写的方法,Adapter的代码在这个的下面;
public class DragGridView extends GridView implements AdapterView.OnItemLongClickListener {
private ImageView dragIiewView;//ImageView,图像容器
private WindowManager windowManager;//窗口
private WindowManager.LayoutParams dragParams;//用于记录窗口展示的位置
private int oldPos;//用于记录拖动的item的position
private int rawX;//用于记录初始坐标X
private int rawY;//用于记录初始坐标Y
private boolean isDrag;//用来判断当前是否是在拖动的状态
public DragGridView(Context context) {
super(context);
initView();
}
public DragGridView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public DragGridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
setOnItemLongClickListener(this);
dragIiewView = new ImageView(getContext());
windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
dragParams = new WindowManager.LayoutParams();
}
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
//记下item的position
oldPos = i;
//获取长按item的DrawingCache
view.destroyDrawingCache();
view.setDrawingCacheEnabled(true);
//获取item的Bitmap
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
//设置拖动参数、以及设置显示出来可以拖动的item放大1.2倍
dragParams.gravity = Gravity