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
- Android DIY之路 (四)拖拽替换,一个view发送其他所有view绑定即可监听到。
- Android DIY之路 (二) 编辑素材图 提供拖拽替换指定区域
- Android进阶之自定义view(四)
- android 自定义 view 之ViewGroup(四)
- android 自定义view之继承(四)
- View监听绑定不上
- Android view 详解(四) 自定义view
- Android 针对layout,view和监听的绑定注解
- 一个可以将 json 字符串 直接绑定到 view 上的Android库
- Android输入事件从读取到分发四:InputDispatcherThread发送事件到View结构树的过程
- Android输入事件从读取到分发四:InputDispatcherThread发送事件到View结构树的过程
- Android自定义view之(刻度尺view)
- Android开发之自定义View专题(四):自定义ViewGroup
- Android自定义控件之自定义View(四)
- iOS添加一个view到所有视图的上面
- Android View动画显示和隐藏(支持所有View)
- Android View框架总结(四)View布局流程之Measure
- Android View框架总结(四)View布局流程之Measure
- 数据结构与算法(13)冒泡排序
- Python中中文乱码问题
- java中的递归调用算法
- Java时间类Date全解析
- Android-满屏幕拖动的控件
- Android DIY之路 (四)拖拽替换,一个view发送其他所有view绑定即可监听到。
- 插入排序
- Ionic 列表
- SpringMVC中AcceptHeaderLocaleResolver分析
- 四种引流的方式
- 透明QT界面
- final关键字
- IO:输入输出
- HDU1698