Android基础之ListView的拖拽实现

来源:互联网 发布:线刷宝刷机有垃圾软件 编辑:程序博客网 时间:2024/06/05 22:56

先来效果看看:

普及下常识知识先 没图没真相看图说话
这里写图片描述
这里写图片描述
我们无非就要得到两个参数 第一个是Gride或者List到屏幕顶部的距离(当然包括StatusBar) 和itemX,itemY相对item的位置对吧


然后说下思路:


在手指按下时候判断下看是否触发了拖动的机关 ,没触发就交给ListView来处理
触发了就交给子视图的那个机关滑块去实现onTouch事件;
假如是触发了我们还要记录下当前点击的ListItem项,
然后开始拖动处理 一起看下startdrag()干了些啥

    public void startDrag(Bitmap bm, int y) {        windowParams = new WindowManager.LayoutParams();        windowParams.gravity = Gravity.TOP;        windowParams.x = 0;        windowParams.y = y - dragPoint + dragOffset;        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.format = PixelFormat.TRANSLUCENT;        windowParams.windowAnimations = 0;        ImageView imageView = new ImageView(getContext());        imageView.setImageBitmap(bm);        imageView.setBackgroundColor(Color.argb(80, 180, 60, 60));        imageView.setScaleY(1.5f);        windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);        windowManager.addView(imageView, windowParams);        dragImageView = imageView;    }

很显然 按下时候我们对镜像缓存做了放大变淡处理 然后添加镜像View到windowManager实现悬浮
(这里我们也可以用mWindowParams.type = indowManager.LayoutParams.TYPE_TOAST) 不过记得要加权限)添加之后每次触摸记得要remove掉添加的视图;


然后就是move手指了 当然在move时候就是开始拖动滑块滚动

看下滚动的实现

    public void onDrag(int y) {        if (dragImageView != null) {            windowParams.alpha = 0.8f;            windowParams.y = y - dragPoint + dragOffset;            windowManager.updateViewLayout(dragImageView, windowParams);        }        // 为了避免滑动到分割线的时候,返回-1的问题        int tempPosition = pointToPosition(0, y);        if (tempPosition != INVALID_POSITION) {            dragPosition = tempPosition;        }        int scrollHeight = 0;        if (y < upScrollBounce) {            scrollHeight = scaledTouchSlop;// 定义向上滚动8个像素        } else if (y > downScrollBounce) {            scrollHeight = -scaledTouchSlop;// 定义向下滚动8个像素        }        if (scrollHeight != 0) {            setSelectionFromTop(dragPosition,                    getChildAt(dragPosition - getFirstVisiblePosition()).getTop() + scrollHeight);        }    }

在这里 先解释下upScrollBounce 和downScrollBounce含义 很明显是判断向上滚动还是该向下滚动
setSelectionFromTop方法也设置了每次要滚动的距离


最后就是up手指了 当然在move时候就是开始拖动滑块了。
主要操作就是从windowManager中remove掉添加的视图和 数据交换
数据交换咱们直接看

        if (dragPosition >= 0 && dragPosition < getAdapter().getCount()) {            DragListAdapter adapter = (DragListAdapter) getAdapter();            String dragItem = adapter.getItem(dragSrcPosition);            adapter.remove(dragItem);            adapter.insert(dragItem, dragPosition);        }

可以看出 直接是remove掉拖动前的那个item 然后将其插入到当前拖动的位置上

0 0
原创粉丝点击