最近发现做的项目主菜单界面两边比较空,看上去不好看。首先第一时间是看布局文件apps_customize_pane.xml,但是里面修改layout_width为fill_parent没用,想估计是在代码中设置宽度的。于是追溯AppsCustomizePagedView.java,发现放应用图标的layout宽度是由这个成员mContentWidth决定,在onDataReady方法里赋值:mContentWidth = mWidgetSpacingLayout.getContentWidth();
PagedViewCellLayout.java:
int getContentWidth() {
return getWidthBeforeFirstLayout() + getPaddingLeft() + getPaddingRight();
}
int getWidthBeforeFirstLayout() {
if (mCellCountX > 0) {
return mCellCountX * mCellWidth + (mCellCountX - 1) * Math.max(0, mWidthGap);
}
return 0;
}
上面这个方法也就是获取应用图标一行所占据的宽度。
这时候我们关键是找到PagedViewCellLayout.mCellCountX,一行排布的应用图标个数。
在PagedViewCellLayout.java里面看到:
mCellCountX = LauncherModel.getCellCountX();
mCellCountY = LauncherModel.getCellCountY();
LauncherModel.java:
static int getCellCountX() {
return mCellCountX;
}
static void updateWorkspaceLayoutCells(int shortAxisCellCount, int longAxisCellCount) {
mCellCountX = shortAxisCellCount;
mCellCountY = longAxisCellCount;
}
LauncherModel.mCellCountX是在上面这个方法中赋值,接下来看哪里调用了这个方法;
Workspace.java
Workspace里:
LauncherModel.updateWorkspaceLayoutCells(cellCountX, cellCountY);
而cellCountX和cellCountY就在上面赋值的
//系统默认值
int cellCountX = DEFAULT_CELL_COUNT_X;
int cellCountY = DEFAULT_CELL_COUNT_Y;
//如果isScreenLarge(在config.xml里面设置true/false),则通过系统宽高(分辨率)和DPI及应用图标的大小计算出行列能排布的应用图标个数
if (LauncherApplication.isScreenLarge()) {
......
cellCountX = 1;
while (CellLayout.widthInPortrait(res, cellCountX + 1) <= smallestScreenDim) {
cellCountX++;
}
cellCountY = 1;
while (actionBarHeight + CellLayout.heightInLandscape(res, cellCountY + 1)
<= smallestScreenDim - systemBarHeight) {
cellCountY++;
}
}
理论上按照上面计算出来的值布局应该是很美观正常的,但是下面来了个去系统里面读这个值,这样便于直接修改配置文件,修改菜单行列应用图标个数,这样可以避免如果不是isScreenLarge,而默认的行列又不美观的情况下,人工去修改。那么直接放在上面if的else是不是更好呢?因为if里面计算出来的基本是最理想的行列应用个数,当然估计出于定制化各种分辨率以及满足不同厂商需求,放在配置中修改,简洁明了。这时候上面的if里面的计算显得那么苍白无力。
cellCountX = a.getInt(R.styleable.Workspace_cellCountX, cellCountX);
cellCountY = a.getInt(R.styleable.Workspace_cellCountY, cellCountY);
最后定位到上述获取到的值在config.xml里面配置的(values-XXdp/config.xml)里面修改行列显示应用个数:
另外设置界面布局也不美观,试了修改ro.sf.lcd_density的值,按照计算density=对角线像素/尺寸(对角线长度),修改成正确的值,也就解决问题了。