当前位置: 首页 > news >正文

基于 Launcher3 的 iOS 风格桌面 04 拖拽和移位

查看效果图

  • 删除自动补位
    remove-movement

  • 拖拽自动排位
    drag-movement

  • 跨页拖拽自动排位
    2-page-drag

需要做的 todo list

  • 删除移位
    • 删除图标时后方应用前移
  • 拖拽移位
    • 页面内拖拽
      • 应用前移/后移
    • 跨页拖拽
      • 拖拽到满屏页面

删除移位

  • 删除应用时后方应用前移
  • 修改 Workspace.javaremoveItemsByMatcher 方法:
public void removeItemsByMatcher(final Predicate<ItemInfo> matcher) {// RemoveItem used to save the removed itemItemInfo removedItem = null;for (int i = container.getChildCount() - 1; i >= 0; i--) {View child = container.getChildAt(i);ItemInfo info = (ItemInfo) child.getTag();if (matcher.test(info)) {layout.removeViewInLayout(child);if (child instanceof DropTarget) {mDragController.removeDropTarget((DropTarget) child);}// Save the remove itemremovedItem = info;}...}if (removedItem != null) {// Move children forward, start from the removed empty cellReorderManager.moveChildrenForward(workspace, positionProvider, removedItem);}
}

拖拽移位

页面内拖拽-应用前移/后移

  • ReorderAlgorithm.java 中修改 findReorderSolution 方法:
fun findReorderSolution(pixelX: Int, pixelY: Int, minSpanX: Int,minSpanY: Int, spanX: Int, spanY: Int, direction: IntArray?, dragView: View?, decX: Boolean,solution: ItemConfiguration
): ItemConfiguration {...val success: Boolean = if (dragView is AppWidgetHostView) {mCellLayout.rearrangementExists(result[0], result[1], spanX, spanY, direction,dragView, solution)} else {// Rearrange children in the cell layoutmCellLayout.rearrangeChildren(result[0], result[1], dragView, solution)}...
}
  • CellLayout.java 中添加 rearrangeChildren 方法:
public boolean rearrangeChildren(int cellX, int cellY, View dragView, ItemConfiguration solution) {// Return early if get invalid cell positionsif (cellX < 0 || cellY < 0) return false;// Get all views in this cell layoutComparator<View> comparator = ReorderManager.getComparator();List<View> views = solution.map.keySet().stream().filter(view -> view instanceof CellView || view instanceof FolderIcon).sorted(comparator).collect(Collectors.toList());// Get target cell index and dragging cell indexint targetIndex = ReorderManager.findItemIndex(views, new CellPos(cellX, cellY, getWorkspace().getIdForScreen(this)));int dragIndex = views.indexOf(dragView);if (targetIndex < 0 || dragIndex < 0) return false;// If target index > drag index, move views forward, otherwise move backwardboolean isMovingForward = targetIndex > dragIndex;// Get all views to be movedint fromIndex = Math.min(targetIndex, dragIndex);int toIndex = Math.max(targetIndex, dragIndex);List<View> moveViews = views.subList(fromIndex, toIndex + 1);// Calc new cell positions for the views to be movedmoveViews.forEach(view -> {CellAndSpan cellAndSpan = solution.map.get(view);if (cellAndSpan == null) {return;}int currentIndex = moveViews.indexOf(view);// Moving forwards, ignore the first dragViewif (isMovingForward && currentIndex == 0) {return;}// Moving backwards, ignore the last targetViewif (!isMovingForward && currentIndex == moveViews.size() - 1) {return;}// Calc the new cell positionCellPos newPos;if (isMovingForward) {newPos = ReorderManager.calcNewForwardPosition(view);} else {newPos = ReorderManager.calcNewBackwardPosition(view);}cellAndSpan.cellX = newPos.cellX;cellAndSpan.cellY = newPos.cellY;});// Set the dragging view's target cell positionif (dragView != null) {CellAndSpan c = solution.map.get(dragView);if (c != null) {c.cellX = cellX;c.cellY = cellY;}}return true;
}

跨页拖拽

  • SpringLoadedDragController.java 中修改 onAlarm 方法:
override fun onAlarm(alarm: Alarm) {mScreen?.let { targetScreen ->// Snap to the screen that we are hovering over nowval w = mLauncher.workspaceif (!w.isVisible(targetScreen)) {// If the target screen is full, we need to prepare an empty cell for the dragging viewif (!targetScreen.existsEmptyCell()) {ReorderManager.prepareEmptyCell(w, targetScreen)}w.snapToPage(w.indexOfChild(targetScreen))}} ?: run {mLauncher.dragController.cancelDrag()}
}
http://www.dtcms.com/a/540563.html

相关文章:

  • django model Manager
  • 前端数据可视化实战:Chart.js vs ECharts 深度对比与实现指南
  • 霍山县网站建设公司寻花问柳专注做一家男人最爱的网站
  • LInux(一)VMware虚拟机中安装CentOS7
  • MATLAB基于对数灰关联度的IOWGA算子最优组合预测模型
  • 企业开源网站系统网页制作软件
  • Linux存储软件栈剖析之第4篇:Linux文件系统的实现
  • Excel怎么将八位数字设置为日期格式?
  • 怎么做系部网站首页做外贸的零售网站
  • 宁波企业网站排名优化公司网络系统管理技能大赛答案
  • 本地网站源码便民信息发布平台
  • Linux 内核内存屏障(中文译文)
  • “二分查找” 咋用?像 “查字典翻页码”,3 步找到目标值​
  • 在Ubuntu中使用Docker打包程序(Conda, pip)
  • 网站优化软件费用大连网站推广优化
  • 31_AI智能体工具插件之增强LangChain注册工具构建高效可控的AI工具生态
  • 怎么做自建站wordpress 导航加图标
  • 解决uni-app通用上传与后端接口不匹配问题:原生上传文件方法封装 ✨
  • 管廊建设网站线上推广网络公司
  • 汽车交互式系统专利拆解:VR/AR 画面生成与挡风玻璃异步转换的流畅性测试
  • Python爬虫实战:中信标普 50 指数数据获取与趋势分析
  • 浦江网站建设站酷app
  • 什么是技术架构、数据架构、业务架构、应用架构、产品架构和项目架构?
  • LLaMA-Factory 集成了哪些超参数调优框架?及 Optuna + Weights Biases + TensorBoard对比分析
  • 【软考架构】案例分析:MongoDB 如何存储非结构化数据以及其矢量化存储的优点。
  • 网络共享总失败?先检查是否有计算机名冲突
  • 最好用的企业网站cms湘潭网站建设工作室
  • 在网站后台做网页河南省工程建设协会网站
  • 【k8s】Deployment、StatefulSet、DaemonSet
  • 优购物官方网站订单查询烟台建设科技网站