初心

何期自性,本自具足

分析Launcher支持用户设置cell数目

| Comments

对比原生Launcher2,分析cyanogenmod中的Trebuchet的设置实现方式。

下载cyanogenmod源码及编译方法

http://wiki.cyanogenmod.org/w/Build_for_grouper#Install_the_repo_command

在settings显示Launcher设置

如果设置Trebuchet为默认启动器,就可以在cm的settings里看到设置Trebuchet的选项。

在Trebuchet的mainifest中,对应设置的activity添加了:

1
<category android:name="com.cyanogenmod.category.LAUNCHER_PREFERENCES" />

通过搜索,在 /packages/apps/Settings/src/com/android/settings/settings.java 中,在 updateHeaderList 方法中添加了对此category的判断(代码省略)。

同时,在res/xml/settings_headers.xml中的适合位置,添加了以下header:

1
2
3
<header android:id="@+id/homescreen_settings"
        android:title="@string/homescreen_settings_title"
        android:icon="@drawable/ic_settings_cmlauncher"/>

修改Cell宽高以适应数目变化

之后在Trebuchet的设置界面,监听设置变化。用户更改设置,使用sharedpreference中的一个数值记录设置是否变化。

在Launcher.java的onResume方法中判断这个值是否变化,如果变化,则使用以下代码重启,同时设此值为false:

1
2
3
if (preferencesChanged()) {
    android.os.Process.killProcess(android.os.Process.myPid());
}

在Workspace.java中,判断如果有用户设置就读取用户设置,并设置LauncherModel的静态变量sWorkspaceCellCountX、sWorkspaceCellCountY。

在CellLayout的构造函数中,添加了下面的关键代码

1
2
3
4
5
6
if (!LauncherApplication.isScreenLarge()) {
  mCellWidth = (mCellWidth * res
      .getInteger(R.integer.default_cell_count_x)) / mCountX;
  mCellHeight = (mCellHeight * res
      .getInteger(R.integer.default_cell_count_y)) / mCountY;
}

这段代码前的mCellWidth、mCellHeight直接读取自res。

其中default_cell_count_x是在res里定义的默认数目。mCountX、mCountY来自LauncherModel,然后就算出了适应的mCellWidthmCellHeight

简单抄袭了下,确实可以设置数目了,显示也正常。不过hotset和folder中的间距也收到影响,待继续研究。。。

Comments