转载请注明链接:https://blog.csdn.net/feather_wch/article/details/79736307
Android中的拖拽
版本:2018/3/29-1(15:31)-3/30(11:05)
这样一个效果该如何实现?
“我想要拖拽一个控件到另一个布局中,手一松就添加到了该布局中”。
主要的方法有通过View的滑动(如改变控件的布局参数等方法),滑动到目标区域即可。可以参考教程:https://blog.csdn.net/feather_wch/article/details/78679327
本文的方法是通过给控件设置OnDragListener(拖拽监听器)
直接完成该效果,更为简单。
简单实例:将一个控件拖拽到一个布局中
主要思路:
1. 给被拖拽控件添加点击事件监听器,并在内部转交给View.startDrag
方法去实现拖拽。
2. 给接收方添加OnDrageListener
,会监听到发生在自身区域内的拖拽事件
,在拖拽完成的回调中将被拖拽控件
添加进来
被拖拽控件:
mAddButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
//1. 剪切板可以保存数据
ClipData data = ClipData.newPlainText("", "");
//2. 影子
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
//3. 震动反馈,不需要震动权限
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
//4. 拖拽
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
view.startDragAndDrop(data, shadowBuilder, view, 0);
}else{
view.startDrag(data, shadowBuilder, view, 0);
}
return true;
}else{
return false;
}
}
});
目标布局接收拖拽的控件:
mRelativeLayout.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()){
case DragEvent.ACTION_DROP:
//1. 响应拖拽,将控件安置到该位置
View otherView = (View) event.getLocalState();
ViewGroup owner = (ViewGroup) otherView.getParent();
owner.removeView(otherView);
RelativeLayout relativeLayout = (RelativeLayout) v;
relativeLayout.addView(otherView);
otherView.setVisibility(View.VISIBLE);
break;
}
return true;
}
});
实例:从RecyclerViewA中将Item拖拽到另一个RecyclerViewB中
主要思路也就是和上面的一样。
区别在于:接收方和被拖拽方都是RecyclerView
,需要通过特定的方法去完成拖拽和添加Item
的功能。
1、RVA中需要实现onDrag拖拽和onItemLongclick长按开始拖拽的两种监听器
public interface RecyclerViewOnItemLongClickListenr{
public boolean onLongClick(View view, ItemDataBean data);
}
public class RecyclerViewOnTouchAndDragListener