Launcher3分析之拖动图标的流程——移动

(系列文章点这里)

移动的逻辑还是比较清楚的,因为他抽象出来的模型十分易于理解的。

DropTarget是一个可放置(drop)区域的抽象,也就是我们松开手的时候想要把图标放到某个东西上,这个东西就是DropTarget,实现他的都是View,比如说文件夹,Workspace,删除区等等,你可以通过“ Open Type Hierarchy”来查看哪些类继承了DropTarget接口。下图是他比较重要的几个接口:

droptarget

  • onDragEnter是当拖动图标到某一DropTarget(蓝色),边缘,刚刚进入DropTarget范围内的时候所调用的内容。比如说我们拖动桌面的一个快捷方式,到桌面顶端的删除区域,“删除”两字和手中的图标会变红,这些动作都是在onDragEnter回调中完成的
  • onDragOver是在某一DropTarget内部移动的时候会调用的回调,比如我们把手上的图标移动到两个图标中间的时候,会发生挤位的情况(就是桌面已有图标让出空位),基本上每个ACTION_MOVE操作都会调用他。
  • onDragExit是从某一DropTarget拖出时候会进行的回调,比如onDragEnter时变红的“删除”和图标会在这个调用中恢复正常。
  • onDrop是松手时候发生的调用,做一些放下时候的操作,比如删除快捷方式的时候会在onDrop里面开始删除的操作。

 

拖动的工作原理说完了,代码就容易理解多了。

起点在DragLayer的onInterceptTouchEvent中,由于DragController接管了DragLayer的滑动事件处理,所以查看DragController的onInterceptTouchEvent方法,由于mDragging是true(返回上一篇回想下什么时候变成true的),所以跳到DragController的onTouchEvent方法,其中的ACTION_MOVE的处理内容基本都在handleMoveEvent方法中。

首先他把拖动的图标移动下位置,然后找到当前坐标下对应的DropTarget,再在checkTouchMove方法中完成上文提到的DropTarget中的一系列回调。最后,在checkScrollState查看是否滑到了屏幕边缘以便切换到其他屏。

 

 

 

 

关于 “Launcher3分析之拖动图标的流程——移动” 的 2 个意见

发表评论

电子邮件地址不会被公开。