1、尺寸和位置
Launcher.java的onCreate中会初始化DeviceProfile
DeviceProfile类中,
构造方法中,初始化了很多桌面布局相关的数据,
比如:屏幕宽高、可见宽高、搜索框的宽高、页面指示器的高度、workspace的边距、桌面图标行列数、图标大小、cell格子的宽高、文件夹图标的大小、文件夹格子的宽高、主菜单行列数等等。
layout方法:初始化了桌面每个组成部分的位置,
比如:搜索栏、workspace、底边栏、页面指示器。
到这一步,搜索栏、workspace、底边栏、页面指示器大小和位置已经确定好。
2、workspace布局
launchermodel中,bindWorkspace会绑定页面bindWorkspaceScreens、绑定图标bindWorkspaceItems
bindWorkspaceScreens
绑定页面bindWorkspaceScreens会回调到launcher的bindScreens,最终掉到workspace中的insertNewWorkspaceScreen,向workspace中添加celllayout
bindWorkspaceItems
绑定图标bindWorkspaceItems会回调到launcher的bindItems,然后new一个BubbleTextView添加到workspace中(workspace.addInScreenFromBind),然后把图标添加到cell中(layout.addViewToCellLayout),最后图标的view被添加到ShortcutsAndWidgets中(mShortcutsAndWidgets.addView)。
由此看出,桌面的层叠关系。具体布局就要研究一下workspace、celllayout、shortcutAndWidgets三个类的onLayout和onMeasure方法。
celllayout布局
celllayout的onMeasure方法中,主要计算了mCellWidth、mCellHeight 、mWidthGap、mHeightGap并 传递给了mShortcutsAndWidgets,并设置了自己的尺寸。
celllayout的onLayout方法中,设置了child.layout
ShortcutsAndWidgets布局
ShortcutsAndWidgets的onMeasure方法中,设置了自己的尺寸、child的尺寸(measureChild)。measureChild中计算了child显示的位置(lp.setup)。
ShortcutsAndWidgets的onLayout方法中,设置了child.layout,也就是每一个图标的位置
至此,桌面所有图标位置计算完成。
3、主菜单/小部件界面布局
launcherModel中,loadAllApps方法加载完所有应用,会调用到launcher的bindAllApplications。在调用AppsCustomizeContent.setApps,该方法中对applist进行排序,并调用updatePageCountsAndInvalidateData更新页面数和布局。最后调用到AppsCustomizeContent的syncPageItems绑定每一个图标。
关于其他细节的布局和workspace类似。