Android DIY之路 (四)拖拽替换,一个view发送其他所有view绑定即可监听到。

来源:互联网 发布:ps软件使用视频教程 编辑:程序博客网 时间:2024/06/05 19:29

前言

最近一个工作需求就是做两个列表之间item的拖拽替换。listview带适配器的均可。
最核心部分一个view开始拖拽 其他需要的地方 接收这一DragEvent

20161020更新 现在看以前的方法真是太SB了。所以今天来更新。
就一个逻辑。
一个view 被拖拽 处处都可以接收。哪怕是不同frament;

任意view都可以实现 跟你本身项目不会有任何冲突。

效果图

这里写图片描述

1. 长按开启拖拽

//这里长按事件加在 第一个拖拽item的列表的item长按事件中 recyclerview1       v.setOnLongClickListener(new View.OnLongClickListener() {                    @Override                    public boolean onLongClick(View v) {                        shadowView = v;                        String TAG = "test";                        ClipData.Item item = new ClipData.Item((String) v.getTag());                        ClipData data = new ClipData(TAG, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);                        Object obj =xxxx;//你想传递的数据。比如你想拖拽替换图片                        v.startDrag(data, new View.DragShadowBuilder(v), obj, 0);                        //第一个view就是 长按谁点击 第二个就是影子的样子                         return true;                    }                });

2. 监听拖拽区域即另一个列表的每一个item

不仅是item 甚至可以精确到你落点在哪一个view上面。只要你想接收到这一拖拽事件 都可以如下绑定
影子变化也可以随心自定义

public class DragUtils {        //用这一接口方便 两个view之间所在的调用    public interface DragStatus {        void complete(String obj);    }    public static void bindDragInZone(View view, final DragStatus impl) {        final int[] dragPoint = new int[2];        final boolean[] isIn = {false};        final String[] localState = {""};        view.setOnDragListener(new View.OnDragListener() {            @Override            public boolean onDrag(View v, DragEvent event) {                final int action = event.getAction();                switch (action) {                    case DragEvent.ACTION_DRAG_STARTED://拖拽开始                        localState[0] = (String) event.getLocalState();                        Log.i("rex", "localState-----" + localState[0]);                        if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {//                            shadowView.setBackgroundResource(R.drawable.xml_rect_line_bg);                            return true;                        }                        return false;                    case DragEvent.ACTION_DRAG_ENTERED://拖拽进入目标区域                        Log.i("rex", "拖拽进入目标区域" + event.getX() + "----" + event.getY());                        ULog.e("拖拽进入目标区域");                        isIn[0] = true;                        return true;                    case DragEvent.ACTION_DRAG_LOCATION://拖拽位置                        return true;                    case DragEvent.ACTION_DRAG_EXITED://拖拽到目标区域外                        isIn[0] = false;                        ULog.e("拖拽到目标区域外");                        return true;                    case DragEvent.ACTION_DROP: //拖拽完成之后松开手指                        ULog.e("拖拽完成之后松开手指" + event.getX() + "----" + event.getY());                        dragPoint[0] = (int) event.getX();                        dragPoint[1] = (int) event.getY();                        return true;                    case DragEvent.ACTION_DRAG_ENDED://拖拽完成                        if (isIn[0] && !TextUtils.isEmpty(localState[0]) && impl != null) {                            impl.complete(localState[0]);                        }                        isIn[0] = false;//                        shadowView.setBackgroundResource(0);//                        if (!isIn) {//                            return true;//                        }//                        findDragPostion(dragPoint[0], dragPoint[1]);//                        isIn = false;                        return true;                    default:                        break;                }                return false;            }        });    }
1 0
原创粉丝点击