一,背景

1.1 灯光控制项目,仿苹果桌面来排版灯具,支持拖拽,分组,分页。

拖动图标的时候判断是否空白位置还是已经有占位了,有的话就把两个图标合合为一个文件夹,同时还得判断是否是不同种类的灯具,则不能合并,是互斥的,会挤压原来位置的图标

1.2 可以看下需求排版效果

f799b2c68c674d36ad61ba4a01f95500.jpeg

dba47d2c3bb84220a7e834f76ee0d7e2.jpeg

1.3 方案:

这种效果关键在于宫格位置坐标和拖动位置的改变,可以把一个页面平等分为几个宫格,把宫格在页面的位置坐标记录下来,拖动图标松手的时候判断是否在某个宫格的范围内,在的话就让图标在这个宫格内居中显示

二,google原生桌面

2.1 既然让仿桌面那就找一套桌面程序参考一下

官方源码:

https://android.googlesource.com/platform/packages/apps/Launcher3/

github项目参考

https://github.com/luohaohaha/launcher3

2.2 google官方源码解析

桌面效果结构

689d962ac034437eaca4eb6edb2eb4d5.png

 2.3 项目目录结构

c029417b7b014f6483567dbf2dd866f1.png

2.4 重点类功能

LauncherModel:
跟数据有关系,保存了桌面运行时的状态信息,也提供了读写数据库的API,他有一个内部类LoaderTask,桌面启动从数据库中读取数据并把图标和小工具添加上去的时候用的就是他。

BubblTextView:
图标都是基于他,不过奇怪的是,他是继承自TextView

DragController:
DragLayer只是一个ViewGroup,具体的拖拽的处理都放到了DragController中。

LauncherAppState:
单例模式,主要在启动的时候用,他初始化了一些对象,并且注册了广播监听器和ContentObserver。

DragView:
在拖动图标的时候跟随手指移动的View就是他。

DragSource,DropTarget:
跟拖拽相关的接口,DragSource表示图标从哪里被拖出来,DropTarget表示图标可以被拖到哪里去。

Folder:
文件夹打开时候那个view。

FolderIcon:
文件夹图标。

LauncherProvider:
数据库类,Launcher3使用了SQLite,数据库文件保存在/data/data/包名/databases/launcher.db 下,有兴趣的同学可以把这个东西拷贝出来,用SQLite的工具看看里面都是怎么保存的。

ItemInfo:
运行时保存了桌面上每个项目的信息,包括图标在第几屏,第几行第几列,高度宽度等信息,每一个ItemInfo对象都对应着数据库中的一条记录。在Launcher3源码路径下,会有很多以Info结尾的类,这些类都是ItemInfo的子类,具体代表了桌面上的某个项目。比如说FolderIcon和FolderInfo是对应的,BubbleTextView和ShortcutInfo是对应的,AppWidgetHostView和LauncherAppWidgetInfo是对应的。有了对应关系,可以这样通过view获取ItemInfo对象:
ItemInfo info = (ItemInfo)bubbletextview.getTag();
这样这里的info其实就是ShortcutInfo对象了。

LauncherProvider:
桌面信息的ContentProvider。

LauncherSettings:
存了数据库相关的常量,字段名,字段常量等等。

DatabaseHelper:
LaucherProvider的内部类,继承自SQLiteOpenHelper,数据库表的创建就是在它的onCreate方法里完成的。

itemInfo:实体类

itemInfo类型:

小工具:AppWidget
快捷方式:应用图标
文件夹:Folder

itemInfo重要参数:

container:表明图标是放在哪里的,是放在Workspace还是Hotseat,还是文件夹里面的。如果是放在Workspace上的,那么值是LauncherSettings.Favorites.CONTAINER_DESKTOP,如果是放在文件夹里面的那么container的值就是文件夹FolderInfo的id。
cellX,cellY:表明所在屏幕的哪个位置,cellY表明第几行,cellX表明第几列。如果是小工具占用多行多列的情况,就记录他左上角的位置。
spanX,spanY:宽度和高度,快捷方式和文件夹宽高都是1,小工具的宽高就要看具体情况了。
title:标题,显示应用的名字,文件夹的名字,小工具的话就不需要这个属性了。
itemType: 数据库里保存的表明这个ItemInfo具体是哪种类型的ItemInfo,启动的时候好生成具体的ItemInfo子类对象。

三 改造

3.1 官方源码东西还是比较多的,把无用的都删掉或禁掉,只保留项目需要的功能,比如负一页,底部导航,搜索栏,上滑出现全部应用,禁止页面缩放,壁纸,小组件等

3.2 具体需要修改的地方文件

f52eb4ff66664f0bbf2c84a41076d349.png

四,集成到自己项目 

 4.1 上面布局改造完毕,该删删,该禁禁,下面就是替换成自己的数据源,项目种主要使用greenDao维护数据表,层级关系 项目 -> 分页 -> 灯具组 -> 灯具,这些是自定义数据

4.2 同时还有一个Cell单元格信息表保存有图标相关信息,图标坐标,颜色,名字,灯具群组id,分页id,灯具id,然后遍历Cell单元格数据,赋值给快捷图标信息ShortcutInfo,再把图标添加进桌面

下面是主要源码数据源绑定地方:

11a5a60ed04740369ea93d63f43ad59e.png1941f163d2e54c1fb65ce6e07abc3420.pngd0a03c188fe1406cac84c2b13fe55ce1.png

 4.3 源码效果图

d24599d3de6c462a8b3a9440c0c7178b.jpeg

 4.4 自定义效果

34da904c285c446c87797d48a84fa2ce.jpeg

 4.5 自定义效果源码链接,可以参考,里面东西都可以改,颜色,文字,排版

MyApplication/customerlauncher3 at master · Biekangdong/MyApplication · GitHub

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐