拖放 Drag and drop
android11-release
Android Developers > Docs > Guides Drag and drop
Android 开发者 > 文档 > 指南 拖放
View.OnDragListener
实现 View.OnDragListener 的拖动事件监听器或其 onDragEvent(DragEvent) 回调方法来接收拖动事件
拖放过程中四种状态:开始、继续、放下、结束
Drag and drop 监听拖拽事件DragEvent 操作类型:
Drag and drop 监听拖拽事件DragEvent 有效数据:
getAction()、describeContents()、writeToParcel() 和 toString() 方法始终返回有效数据。如果某个方法不包含特定操作类型的有效数据,则根据其结果类型,该方法将返回 null 或 0。
拖动阴影
View.DragShadowBuilder 对象声明的方法来创建拖动阴影,然后在使用 startDrag() 开始拖动时将其传递给系统。作为对 startDrag() 响应的一部分,系统会通过调用您在 View.DragShadowBuilder 中定义的回调方法来获取拖动阴影。
View.DragShadowBuilder 类有两个构造函数:
View.DragShadowBuilder 类有两个方法:
XhDragSampler示例
Drag and drop官网都有详细使用说明:Android 开发者 > 文档 > 指南 拖放
长按监听进入拖拽
startDragAndDrop
API level 24(startDrag
API level 11) 进入拖拽ClipData
拖放操作传输的数据的对象View.DragShadowBuilder
拖动阴影
imageView.setOnLongClickListener((View.OnLongClickListener) v -> {ClipData.Item item = new ClipData.Item((CharSequence) v.getTag());ClipData dragData = new ClipData((CharSequence) v.getTag(),new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN},item);//View.DragShadowBuilder myShadow = new MyDragShadowBuilder(imageView);View.DragShadowBuilder myShadow = new View.DragShadowBuilder(imageView);// Starts the dragv.startDragAndDrop(dragData, // the data to be draggedmyShadow, // the drag shadow buildernull, // no need to use local data0 // flags (not currently used, set to 0));return true;});
View.OnDragListener监听
设置View.OnDragListener
监听imageView.setOnDragListener(this);event.getAction()
都有相应的说明,ACTION_DRAG_STARTED
\ACTION_DRAG_ENDED
处理开始和结束,其他action并不是非得触发或有什么先后顺序,如下面日志输出@Overridepublic boolean onDrag(View v, DragEvent event) {final int action = event.getAction();switch (action) {case DragEvent.ACTION_DRAG_STARTED:Log.d(TAG, "DragEvent.ACTION_DRAG_STARTED = " + DragEvent.ACTION_DRAG_STARTED);return true;case DragEvent.ACTION_DRAG_ENTERED:Log.d(TAG, "DragEvent.ACTION_DRAG_ENTERED = " + DragEvent.ACTION_DRAG_ENTERED);return true;case DragEvent.ACTION_DRAG_LOCATION:Log.d(TAG, "DragEvent.ACTION_DRAG_LOCATION = " + DragEvent.ACTION_DRAG_LOCATION);return true;case DragEvent.ACTION_DRAG_EXITED:Log.d(TAG, "DragEvent.ACTION_DRAG_EXITED = " + DragEvent.ACTION_DRAG_EXITED);return true;case DragEvent.ACTION_DROP:Log.d(TAG, "DragEvent.ACTION_DROP = " + DragEvent.ACTION_DROP);return true;case DragEvent.ACTION_DRAG_ENDED:Log.d(TAG, "DragEvent.ACTION_DRAG_ENDED = " + DragEvent.ACTION_DRAG_ENDED);if (event.getResult()) {Toast.makeText(this, "The drop was handled.", Toast.LENGTH_LONG).show();} else {Toast.makeText(this, "The drop didn't work.", Toast.LENGTH_LONG).show();}return true;default:Log.e(TAG, "Unknown action type received by OnDragListener.");break;}return false;}