在开始之前,有必要简单描述下Launcher的作用和功能。Launcher是Android系统启动后运行的第一个应用,它负责除应用本身操作外的所有操作,包括有几个桌面、点击应用程序图标启动应用程序、长时间按桌面出现上下文菜单、长按桌面图标出现垃圾箱、长按桌面应用程序后可以移动位置和设置壁纸等,添加Widget,设置文件夹等功能。虽然它负责的操作看是很多,但它和普通的应用程序具有一样的权限和应用等级。所以Launcher是可以替换的,开发者可以按照自己的需求设计并实现相关的Launcher应用。一般而言,由于Launcher应用的特殊地位,一般厂商对应用进行定制都会从Launcher开始,第二位的就要说是Setting了.
下面我们就来分析下Launcher的相关内容. 我们分析的Launcher代码为AWD Launcher的开源代码。大家可以在http://code.google.com/p/adw-launcher-android/ 获取到. AWD Launcher的开源代码是在SDK2.0的Launcher代码基础上加工的。所以与系统源代码有一定的延续性。基本的实现机制与思路都是一致的.
Launcher的基本UI构成
要说UI结果,我们采用Hierarchy View工具分析界面可得到如下基本UI结构结构。
简单说下: 左边的效果图与右边的结构图是一一对应的。对应布局文件而言,文件结构主要对应于layout-port/launcher.xml布局文件.两者存在对应关系。 上面的UI结构为树形结构最底层的为DragLayer,DragLayer其实为Launcher实现拖拽的基本机制。后续将有分析.
- 抛开DragLayer不看,我们会发现整个界面是以一个名为Workspace的View容器为基础的。Workspace是继承与ViewGroup的组件,我们看到的每一屏就是一个CellLayout组件,这些CellLayout并排平铺在Workspace上,这样我们在Workspace上面左右拖动的时候就能完成CellLayout的切换了.
Workspace 与 CellLayout的 关系如下:
- CellLayout实现了屏幕位置的单元格化的管理。 Celllayout被划分为了4行4列的表格,用Boolean类型的mOccupied二维数组来标记每个cell是否被占用。在attrs.xml中定义了shortAxisCells和longAxisCells分别存储x轴和y轴方向的cell个数。在Celllayout构造函数中初始化。CellLayout有除了shortAxisCells 和longAxisCells参数外还有多个参数可以设置。
- 除了Workspace 中除了CellLayout外还有 AllAppsSlidingView, 默认情况下AllAppsSlidingView为隐藏状态,单点击应用菜单键才会展示,应用展示所有有应用图标的应用。
- 与Workspace同级的组件还有DeleteZone 和 DockBar,DesktopIndicator。三者分别对应于不同位置的组件.
- DeleteZone 对应于删除区域,每次长按拖动图标的时候,桌面会显示一个垃圾桶的区域就是DeleteZone
- DockBar 是个快捷启动组件。他就是截图中最底下的哪个部分。
- DesktopIndicator对应与截图上部那些个指示当前所在屏幕位置的提示。
上述就是对UI组件各个部分的简要描述。通过这些描述我们大概清楚了Launcher应用大概由那些View元素组成的。这些元素的结构关系是怎么样的。如果我们想修改某个方面的内容,初略的也有了修改的方向。 当然仅仅知道这些初略的东东是远远不够的,我们需要进一步的分析其具体的实现机制。