开始拖拽应用后,除了workspace进入springload之外,其他模块也会进入springload,主要是folder、allapp、widget这三个模块。而后面三个模块最终也进入workspace的拖拽。当进入springload模式之后,就要关注到拖拽的任务,在前文中有两个拖拽的核心类没有展开讲,现在则开始补上之前很重要而没有细说的DragListener 和DropTarget。这两个方法从开始drag到移动应用到松手始终处于活跃状态。
首先是DragListener是一个接口,对于观察者模式,里面包含两个方法,onDragStart和onDragEnd。负责处理拖拽开荒工作和善后工作。
public interface DragListener {
void onDragStart(DropTarget.DragObject dragObject, DragOptions options);
void onDragEnd();
}
源码中的绑定:
PopupContainerWithArrow、WidgetHostViewLoader、DropTargetBar、Workspace
首先看workspace怎么实现DragListener 中两种方法:
@Override
public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) {
if (ENFORCE_DRAG_EVENT_ORDER) {
enforceDragParity("onDragStart", 0, 0);
}
if (mDragInfo != null && mDragInfo.cell != null) {
CellLayout layout = (CellLayout) mDragInfo.cell.getParent().getParent();
layout.markCellsAsUnoccupiedForView(mDragInfo.cell);
}
//确定是否需要创建在桌面上白色框的预览。
if (mOutlineProvider != null) {
// The outline is used to visualize where the item will land if dropped
mOutlineProvider.generateDragOutline(mCanvas);
}
//会调用mLauncher的很多方法,比如,drag期间,横竖屏就不切换了,比如,如果集成了callback则onInteractionBegin也可以进行一些操作。
updateChildrenLayersEnabled(false);
mLauncher.onDragStarted();
mLauncher.lockScreenOrientation();