Drag and drop拖放框架

android11-release
应用使用 拖放 Drag and drop


Drag and drop拖放启动

APP调用启动

拖放 Drag and drop startDragAndDrop 启动
frameworks/base/core/java/android/view/View.java

frameworks\base\services\core\java\com\android\server\wm\Session.java

初始化DragState并注册InputChannel

  • 初始化DragState
  • 注册drag InputChannel\DragInputEventReceiver
  • 通知拖放开始mDragState.broadcastDragStartedLocked(touchX, touchY);触发DragEvent.ACTION_DRAG_STARTED

frameworks/base/services/core/java/com/android/server/wm/DragDropController.java

frameworks/base/services/core/java/com/android/server/wm/DragState.java
frameworks/base/services/core/java/com/android/server/wm/WindowManagerInternal.java
frameworks/base/services/core/java/com/android/server/wm/DragInputEventReceiver.java

最后notifyLocationLocked

  • (touchedWin != mTargetWindow) && (mTargetWindow != null) 时触发 DragEvent.ACTION_DRAG_EXITED
  • touchedWin != null 时触发 DragEvent.ACTION_DRAG_LOCATION
  • 通过ViewRootImplmpl层层调用,result = mView.dispatchDragEvent(event)通知APP并接受返回值
  • li.mOnDragListener.onDrag(this, event)真正通知APP
    frameworks/base/core/java/android/view/ViewRootImpl.java
    frameworks/base/core/java/android/view/View.java

Drag and drop拖放启动小结:

  1. APP启动startDragAndDrop,并View.OnDragListener监听
  2. 初始化DragState和注册drag InputChannel\DragInputEventReceiver
  3. ViewRootImpl中result = mView.dispatchDragEvent(event);发送到View,这里注意返回值result
  4. View中li.mOnDragListener.onDrag(this, event) 通知到APP监听
  5. SurfaceControl控制显示Surface,该显示与一般WMS显示不同

Drag and drop拖放action触发问题

public static final int ACTION_DRAG_STARTED = 1;
public static final int ACTION_DRAG_LOCATION = 2;
public static final int ACTION_DROP = 3;
public static final int ACTION_DRAG_ENDED = 4;
public static final int ACTION_DRAG_ENTERED = 5;
public static final int ACTION_DRAG_EXITED = 6;

- ACTION_DRAG_STARTED

当应用调用 startDragAndDrop\startDrag 并获取拖动阴影后,视图对象的拖动事件监听器会立即收到此事件操作类型。

1 触发

上面也看到初始化registerInputChannel完成后mDragState.broadcastDragStartedLocked(touchX, touchY)通知完成:
performDrag -> broadcastDragStartedLocked -> sendDragStartedLocked -> newWin.mClient.dispatchDragEvent(event)\dispatchDragEvent(DragEvent event) -> handleDragEvent

2 通知APP监听前操作

frameworks/base/core/java/android/view/ViewRootImpl.java
handleDragEvent 中设置mCurrentDragView = nullmDragDescription保存 event.mClipDescription

3 result = mView.dispatchDragEvent(event)返回值

result 无论返回 truefalse 没有其他处理,所有没有其他影响。

- ACTION_DRAG_LOCATION

当收到 ACTION_DRAG_ENTERED 事件且拖动阴影仍在视图的边界框内时,该视图对象的拖动事件监听器会收到此事件操作类型。

1 触发

这里注册了drag InputChannel\DragInputEventReceiver,收到ACTION_MOVE事件调用mDragDropController.handleMotionEvent(Android 12 beta4这里没有任何操作),!mMuteInput最终调用到mDragState.notifyMoveLocked

frameworks/base/services/core/java/com/android/server/wm/DragInputEventReceiver.java
frameworks/base/services/core/java/com/android/server/wm/DragDropController.java
frameworks/base/services/core/java/com/android/server/wm/DragState.java

在 DragState中notifyLocationLocked 通过touchedWin.mClient.dispatchDragEvent(evt)调用到ViewRootImpl中handleDragEvent


流程小结:drag InputChannel\DragInputEventReceiver -> handleMotionEvent -> notifyMoveLocked\notifyLocationLocked -> touchedWin.mClient.dispatchDragEvent(evt)\dispatchDragEvent(DragEvent event) -> handleDragEvent

2 通知APP监听前操作

frameworks/base/core/java/android/view/ViewRootImpl.java

3 result = mView.dispatchDragEvent(event)返回值

result 无论返回 truefalse!event.mEventHandlerWasCalled判断执行setDragFocus

- ACTION_DROP

当用户将拖动阴影释放到视图对象上时,该视图对象的拖动事件监听器会收到此事件操作类型。仅当视图对象的监听器在响应 ACTION_DRAG_STARTED 拖动事件时返回布尔值 true 时,系统才会将该操作类型发送至该监听器。如果用户将拖动阴影释放到未注册监听器的视图上或不属于当前布局的任何视图上,系统都不会发送此操作类型。
如果成功处理了放下操作,监听器应返回布尔值 true。否则,它应返回 false。

1 触发

这里注册了drag InputChannel\DragInputEventReceiver,收到ACTION_UP\ACTION_CANCEL事件调用mDragDropController.handleMotionEvent(Android 12 beta4这里没有任何操作),!mMuteInput最终调用到mDragState.notifyDropLocked

在 DragState中notifyLocationLocked 通过touchedWin.mClient.dispatchDragEvent(evt)调用到ViewRootImpl中handleDragEvent


流程小结:drag InputChannel\DragInputEventReceiver -> handleMotionEvent -> notifyMoveLocked\notifyLocationLocked -> touchedWin.mClient.dispatchDragEvent(evt)\dispatchDragEvent(DragEvent event) -> handleDragEvent

ACTION_DRAG_LOCATION不同的是这里超时5s执行mDragState.endDragLocked()

这里也可能不会触发DragEvent.ACTION_DROPcloseLocked()结束触发DragEvent.ACTION_DRAG_ENDED

2 通知APP监听前操作

frameworks/base/core/java/android/view/ViewRootImpl.java

3 result = mView.dispatchDragEvent(event)返回true情况

APP返回true结束拖放closeLocked()结束触发DragEvent.ACTION_DRAG_ENDED

- ACTION_DRAG_ENDED

当系统结束拖动操作时,视图对象的拖动事件监听器会收到此事件操作类型。
此操作类型不一定在 ACTION_DROP 事件之后。
如果系统已发送 ACTION_DROP,收到 ACTION_DRAG_ENDED 操作类型并不表示放下操作成功。
监听器必须调用 getResult() 才能获得响应 ACTION_DROP 时所返回的值。
如果未发送 ACTION_DROP 事件,getResult() 将返回 false。

1 触发

读到这里,上面可看到closeLocked()方法触发DragEvent.ACTION_DRAG_ENDED

这里先注销drag input channel

2 通知APP监听前操作

3 result = mView.dispatchDragEvent(event)返回值

result 无论返回 truefalse都重置

- ACTION_DRAG_ENTERED\ACTION_DRAG_EXITED

**ACTION_DRAG_ENTERED**当拖动阴影刚进入视图的边界框时,视图对象的拖动事件监听器会收到此事件操作类型。这是监听器在拖动阴影进入边界框时收到的第一个事件操作类型。如果监听器想继续接收此操作的拖动事件,必须向系统返回布尔值 true。
**ACTION_DRAG_EXITED**当收到 ACTION_DRAG_ENTERED 和至少一个 ACTION_DRAG_LOCATION 事件,并且用户已将拖动阴影移至视图的边界框以外时,该视图对象的拖动事件监听器会收到此事件操作类型。

1 触发

从上面看到setDragFocus设置刷新时会触发

2 直接调用callDragEventHandler

ACTION_DRAG_ENTERED 说明返回 true,目前没有看到为什么

Drag and drop拖放框架相关推荐

  1. html拖放数据库字段,HTML5 拖放(Drag 和 Drop)

    拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. #div1 {width:350px;height:70px;padding:10p ...

  2. html5 drag this,HTML5拖放(drag和drog)

    拖放(drag和drog)是HTML5的标准的组成部分,也是种常见的特性,意义为抓起一个元素放入到另外的一个位置,在HTML5中任何元素都可以被拖放,前题是要相关进行设置. 1.设置元素为可拖放,也就 ...

  3. html拖放数据库字段,利用HTML5拖放(Drag 和 Drop)实现Table间数据的交互

    前言 作为开发者,我们总是会不经意间的遇到一些令人头疼的需求.比如五彩斑斓的黑,根据手机壳变换APP的颜色等等,你说怎么办.虽然在一般情况下不会这么棘手,但是有些需求刚拿到的时候还是会一筹莫展. 表格 ...

  4. html5怎么设置drop,HTML5 拖放(Drag 和 Drop)

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 将 RUNOOB.COM 图标拖动到矩形框中. 拖放 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标 ...

  5. Android 用户界面---拖放(Drag and Drop)(二)

    拖拽事件监听器和回调方法 View对象既可以用实现View.OnDragListener接口的拖放事件监听器,也可以用View对象的onDragEvent(DragEvent)回调方法来接收拖拽事件. ...

  6. [Ext JS 4] 拖放[drag and drop]

    定义拖放 一个拖动操作,就是在某个页面元素上按下鼠标并移动.一个放下操作,就是在拖动动作之后放开鼠标.可以从下图来看: Ext JS 的Ext.dd 类中定义了基本的拖放操作. 拖放类的组织 所有的拖 ...

  7. html5css3菜鸟教程,HTML5+CSS3实现拖放(Drag and Drop)示例

    本文简单介绍一下HTML5的拖放实现.MXGHTML5中文学习网 - HTML5先行者学习网 拖放(Drag 和 drop)是 HTML5 标准的组成部分.MXGHTML5中文学习网 - HTML5先 ...

  8. HTML5 拖放(Drag 和 Drop)简介

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖 ...

  9. 拖放API中的drag和drop实战

    原文地址:→传送门 写在前面 在HTML5之前,实现拖放功能需要借助mousedown/mousemove/mouseover/mouseout/mouseup等鼠标事件来完成,HTML5中拖放API ...

最新文章

  1. 视频+课件| PointDSC:基于特征匹配的点云配准方法(CVPR2021)
  2. c# 单例 按需创建
  3. JavaScript使用ACTIVEX控件引起崩溃问题的解决
  4. HTML中如何写for循环全选,利用html:multibox 循环遍历checkbox 并且全选全解除
  5. Redis与其他缓存框架的对比
  6. docker学习笔记(六)docker-compose
  7. Computer Vision的尴尬
  8. 2017.10.9 DZY Loves Math V 失败总结
  9. 如何在Python中获取当前时间
  10. 【MySQL】MySQL 界面连接工具 优化工具 监控工具 其他工具 简介
  11. Ajax基础--创建XMLHttpRequest对象
  12. 微软推出一波AI新功能:自动生成图表、更贴心的Cortana和搜索
  13. SQL Server 镜像
  14. devc编译器中的socket编程爬坑日记
  15. BSOJ 2927 -- 【模拟试题】保镖排队
  16. win10打开红警卡死的解决方法--win10专业版
  17. python request 报错 #No JSON object could be decoded
  18. 膜拜大神,Linux之父家中停电6天,竟然还码出新版Linux内核!
  19. 【已解决】ORB_SLAM2 编译 ./build_ros.h错误
  20. 水果销售系统功能设计

热门文章

  1. 一年来终于用实际案例把matplotlib的绘图坐标轴说清楚了-太给力了
  2. 笔记-知识产权与标准化知识-中华人民共和国政府采购法
  3. 领域驱动架构(DDD)建模中的模型到底是什么? 1
  4. L1-005. 考试座位号
  5. python查看手机上wifi密码_忘了wifi密码怎么办?用Python查!
  6. 校园宽带客户端认证程序无法继续初始化绑定通信接口网络地址失败_解决办法
  7. 键盘党的福音 史上最全win8快捷键大集合
  8. Oracle分页查询存储过程(适用于单表查询)
  9. 9 使用AD滴泪与敷铜
  10. ECHARTS的基本使用:柱状图、折线图、饼图等