android Launcher简单调整布局

         最近发现做的项目主菜单界面两边比较空,看上去不好看。首先第一时间是看布局文件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);

cellCountXcellCountY就在上面赋值的

//系统默认值

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)里面修改行列显示应用个数:

     8
    6


另外设置界面布局也不美观,试了修改ro.sf.lcd_density的值,按照计算density=对角线像素/尺寸(对角线长度),修改成正确的值,也就解决问题了。


你可能感兴趣的:(android学习之路)