Android View 拖拽 移动 碰撞 事件
1. 被拖动view
监听被拖动view 的长按事件,通过ClipData 生成影子view,可在此方法之后设置view为隐藏状态
view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { ClipData.Item item=new ClipData.Item((String)v.getTag()); ClipData data=new ClipData(TAG,new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN},item); v.startDrag(data,new View.DragShadowBuilder(v),null,0); return true; } });
2. 目标view
给目标view设置OnDragListener事件
layout.setOnDragListener(dragListener);
在事件回调方法中,可根据用户手指拖动的范围进行相应操作
View.OnDragListener dragListener=new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { final int action = event.getAction(); switch (action) { case DragEvent.ACTION_DRAG_STARTED://拖拽开始 if (event.getClipDescription().hasMimeType (ClipDescription.MIMETYPE_TEXT_PLAIN)) {return true;} return false; case DragEvent.ACTION_DRAG_ENTERED://拖拽进入目标区域 return true; case DragEvent.ACTION_DRAG_LOCATION://拖拽位置 return true; case DragEvent.ACTION_DRAG_EXITED://拖拽到目标区域外 return true; case DragEvent.ACTION_DROP: //拖拽完成之后松开手指 return true; case DragEvent.ACTION_DRAG_ENDED://拖拽完成 return true; default: break; } return false; } };