"这篇个人总结主要探讨了Android Launcher3中Folder模块的相关内容,特别是关于文件夹实时创建的流程。作者分享了多年在开发Launcher时积累的经验,适合对此领域有兴趣或需求的人参考学习。" 在Android Launcher3中,Folder模块扮演着用户界面中组织应用快捷方式和文件夹的重要角色。拖拽操作是创建文件夹的关键步骤,这个过程涉及到了多个方法和逻辑判断。当用户开始拖动一个图标时,`onDragOver()`方法在`Workspace.java`中被持续调用,这标志着拖放过程的开始。 `onDragOver()`方法中,`setCurrentDropOverCell()`用于设置当前的拖放目标单元格,`getDistanceFromCell()`计算拖动视图中心点与目标单元格的距离。`manageFolderFeedback()`函数处理拖放反馈,它根据当前的状态和位置信息更新视觉效果。这个函数可能包括调整拖动视图的形状、大小和颜色,以提供用户友好的交互体验。 接下来,`isNearestDropLocationOccupied()`方法检查最近的落点是否已被占用。如果未被占用,`visualizeDropLocation()`将被调用来可视化拖放位置,即在屏幕上显示一个临时的占位符,以预览应用图标放入新位置后的效果。这有助于用户预判拖放结果,并在视觉上增强操作的连贯性。 当`mDragMode`不是`DRAG_MODE_NONE`或`DRAG_MODE_REORDER`,并且没有重新排序的定时器正在等待时,系统可能会执行其他操作,如创建新的文件夹。`mReorderAlarm`可能是用于管理拖放操作计时的内部机制,确保在特定条件下正确地处理拖放操作。 这个总结提供了Android Launcher3中创建文件夹的底层实现细节,对于想要深入理解Launcher工作原理或者打算自定义Launcher的开发者来说,是非常宝贵的信息。通过这个总结,读者可以了解到如何跟踪和处理拖放事件,以及如何在界面上实时反馈用户的操作,从而提升用户体验。
实时创建文件夹流程:
拖拽时会不断调用Workspace.java 中的onDragOver()方法:
public void onDragOver(DragObject d) {
................
setCurrentDropOverCell(mTargetCell[0], mTargetCell[1]);
float targetCellDistance = mDragTargetLayout.getDistanceFromCell(
mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell);
final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0],
mTargetCell[1]);
manageFolderFeedback(info, mDragTargetLayout, mTargetCell,
targetCellDistance, dragOverView);//此句为重点
boolean nearestDropOccupied = mDragTargetLayout.isNearestDropLocationOccupied((int)
mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1], item.spanX,
item.spanY, child, mTargetCell);
if (!nearestDropOccupied) {
mDragTargetLayout.visualizeDropLocation(child, mDragOutline,
(int) mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1],
mTargetCell[0], mTargetCell[1], item.spanX, item.spanY, false,
d.dragView.getDragVisualizeOffset(), d.dragView.getDragRegion());
} else if ((mDragMode == DRAG_MODE_NONE || mDragMode == DRAG_MODE_REORDER)
&& !mReorderAlarm.alarmPending() && (mLastReorderX != reorderX ||
mLastReorderY != reorderY)) {
// reorder, then we schedule a reorder
ReorderAlarmListener listener = new ReorderAlarmListener(mDragViewVisualCenter,
minSpanX, minSpanY, item.spanX, item.spanY, d.dragView, child);
mReorderAlarm.setOnAlarmListener(listener);
mReorderAlarm.setAlarm(REORDER_TIMEOUT);
}
if (mDragMode == DRAG_MODE_CREATE_FOLDER || mDragMode == DRAG_MODE_ADD_TO_FOLDER ||
!nearestDropOccupied) {
if (mDragTargetLayout != null) {
mDragTargetLayout.revertTempState();
}
}
}
}
private void manageFolderFeedback(ItemInfo info, CellLayout targetLayout,
int[] targetCell, float distance, View dragOverView) {
boolean userFolderPending = willCreateUserFolder(info, targetLayout, targetCell, distance,
false);
if (mDragMode == DRAG_MODE_NONE && userFolderPending &&
!mFolderCreationAlarm.alarmPending()) {
mFolderCreationAlarm.setOnAlarmListener(new
FolderCreationAlarmListener(targetLayout, targetCell[0], targetCell[1]));
mFolderCreationAlarm.setAlarm(FOLDER_CREATION_TIMEOUT);
return;
}
剩余13页未读,继续阅读
- 粉丝: 1
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WebLogic集群配置与管理实战指南
- AIX5.3上安装Weblogic 9.2详细步骤
- 面向对象编程模拟试题详解与解析
- Flex+FMS2.0中文教程:开发流媒体应用的实践指南
- PID调节深入解析:从入门到精通
- 数字水印技术:保护版权的新防线
- 8位数码管显示24小时制数字电子钟程序设计
- Mhdd免费版详细使用教程:硬盘检测与坏道屏蔽
- 操作系统期末复习指南:进程、线程与系统调用详解
- Cognos8性能优化指南:软件参数与报表设计调优
- Cognos8开发入门:从Transformer到ReportStudio
- Cisco 6509交换机配置全面指南
- C#入门:XML基础教程与实例解析
- Matlab振动分析详解:从单自由度到6自由度模型
- Eclipse JDT中的ASTParser详解与核心类介绍
- Java程序员必备资源网站大全