前言
最近一个工作需求就是做两个列表之间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;
}
});
}