1 修改主界面 pageindicator、workspace、hotseat方面的调整
主要是在packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java 如下函数中进行调整
public void layout(Launcher launcher, boolean notifyListeners) { FrameLayout.LayoutParams lp; boolean hasVerticalBarLayout = isVerticalBarLayout(); // Layout the search bar space Point searchBarBounds = getSearchBarDimensForWidgetOpts(); View searchBar = launcher.getDropTargetBar(); lp = (FrameLayout.LayoutParams) searchBar.getLayoutParams(); lp.width = searchBarBounds.x; lp.height = searchBarBounds.y; lp.topMargin = mInsets.top + edgeMarginPx; searchBar.setLayoutParams(lp); // Layout the workspace PagedView workspace = (PagedView) launcher.findViewById(R.id.workspace); Rect workspacePadding = getWorkspacePadding(null); workspace.setPadding(workspacePadding.left, workspacePadding.top, workspacePadding.right, workspacePadding.bottom-110); //workspace距pageindicator的距离 // Layout the hotseat Hotseat hotseat = (Hotseat) launcher.findViewById(R.id.hotseat); lp = (FrameLayout.LayoutParams) hotseat.getLayoutParams(); // We want the edges of the hotseat to line up with the edges of the workspace, but the // icons in the hotseat are a different size, and so don't line up perfectly. To account for // this, we pad the left and right of the hotseat with half of the difference of a workspace // cell vs a hotseat cell. float workspaceCellWidth = (float) getCurrentWidth() / inv.numColumns; float hotseatCellWidth = (float) getCurrentWidth() / inv.numHotseatIcons; int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2); if (hasVerticalBarLayout) { // Vertical hotseat -- The hotseat is fixed in the layout to be on the right of the // screen regardless of RTL int paddingRight = mInsets.left > 0 ? hotseatBarLeftNavBarRightPaddingPx : hotseatBarRightNavBarRightPaddingPx; int paddingLeft = mInsets.left > 0 ? hotseatBarLeftNavBarLeftPaddingPx : hotseatBarRightNavBarLeftPaddingPx; lp.gravity = Gravity.RIGHT; lp.width = hotseatBarSizePx + mInsets.left + mInsets.right + paddingLeft + paddingRight; lp.height = LayoutParams.MATCH_PARENT; hotseat.getLayout().setPadding(mInsets.left + cellLayoutPaddingLeftRightPx + paddingLeft, mInsets.top, mInsets.right + cellLayoutPaddingLeftRightPx + paddingRight, workspacePadding.bottom + cellLayoutBottomPaddingPx); } else if (isTablet) { // Pad the hotseat with the workspace padding calculated above lp.gravity = Gravity.BOTTOM; lp.width = LayoutParams.MATCH_PARENT; lp.height = hotseatBarSizePx + mInsets.bottom; hotseat.getLayout().setPadding(hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx, hotseatBarTopPaddingPx, hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx, hotseatBarBottomPaddingPx + mInsets.bottom + cellLayoutBottomPaddingPx); } else { // For phones, layout the hotseat without any bottom margin // to ensure that we have space for the folders lp.gravity = Gravity.BOTTOM; lp.width = LayoutParams.MATCH_PARENT; lp.height = hotseatBarSizePx + mInsets.bottom-80; //hotseat的高度 hotseat.getLayout().setPadding(hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx, hotseatBarTopPaddingPx, hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx, hotseatBarBottomPaddingPx + mInsets.bottom + cellLayoutBottomPaddingPx); } hotseat.setLayoutParams(lp); // Layout the page indicators View pageIndicator = launcher.findViewById(R.id.page_indicator); if (pageIndicator != null) { lp = (FrameLayout.LayoutParams) pageIndicator.getLayoutParams(); if (isVerticalBarLayout()) { if (mInsets.left > 0) { lp.leftMargin = mInsets.left; } else { lp.leftMargin = pageIndicatorLandWorkspaceOffsetPx; } lp.bottomMargin = workspacePadding.bottom; } else { // Put the page indicators above the hotseat lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; lp.height = pageIndicatorSizePx; lp.bottomMargin = hotseatBarSizePx + mInsets.bottom-80; pageindicator距hotseat距离 } pageIndicator.setLayoutParams(lp); } // Layout the Overview Mode ViewGroup overviewMode = launcher.getOverviewPanel(); if (overviewMode != null) { int visibleChildCount = getVisibleChildCount(overviewMode); int totalItemWidth = visibleChildCount * overviewModeBarItemWidthPx; int maxWidth = totalItemWidth + (visibleChildCount - 1) * overviewModeBarSpacerWidthPx; lp = (FrameLayout.LayoutParams) overviewMode.getLayoutParams(); lp.width = Math.min(availableWidthPx, maxWidth); lp.height = getOverviewModeButtonBarHeight(); lp.bottomMargin = mInsets.bottom; overviewMode.setLayoutParams(lp); } // Layout the AllAppsRecyclerView View view = launcher.findViewById(R.id.apps_list_view); int paddingLeftRight = desiredWorkspaceLeftRightMarginPx + cellLayoutPaddingLeftRightPx; view.setPadding(paddingLeftRight, view.getPaddingTop(), paddingLeftRight, view.getPaddingBottom()); if (notifyListeners) { for (int i = mListeners.size() - 1; i >= 0; i--) { mListeners.get(i).onLauncherLayoutChanged(); } } } public int getCellHeight(@ContainerType int containerType) { switch (containerType) { case CellLayout.WORKSPACE: return cellHeightPx; case CellLayout.FOLDER: return folderCellHeightPx; case CellLayout.HOTSEAT: return 100; //hotseat的高度 default: // ?? return 0; }
根据不同项目的屏幕配置及客户需求,相应的调整上述相应的参数即可!
在调整workspace距离pageindicator之间距离时,即
workspace.setPadding(workspacePadding.left, workspacePadding.top, workspacePadding.right,
workspacePadding.bottom);调整时,本来认为在函数getWorkspacePadding(Rect recycle)中workspacePadding.bottom=paddingBottom=hotseatBarSizePx + pageIndicatorSizePx;
pageIndicatorSizePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_min_page_indicator_size); //32dp=64px
hotseatBarSizePx = isVerticalBarLayout()? Utilities.pxFromDp(inv.iconSize, dm)
: res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_size) + hotseatBarTopPaddingPx + hotseatBarBottomPaddingPx; //针对竖屏固定值是80dp+2dp+8dp=180px;横屏时获取inv.iconSize
但是在打印log时在我的项目中回出现hotseatBarSizePx会变成200多px,导致在本项目中workspace占据整个屏幕,所以项目中才进行减值计算!
思考:针对isVerticalBarLayout(),在竖屏状态时,有时打印的log也会使得该函数返回值为true;那么会不会hotseatBarSizePx会获取横屏状态下的数值,即Utilities.pxFromDp(inv.iconSize, dm);因为在InvariantDeviceProfile文件的构造函数中有
landscapeProfile = new DeviceProfile(context, this, smallestSize, largestSize, largeSide, smallSide, true /* isLandscape */); portraitProfile = new DeviceProfile(context, this, smallestSize, largestSize, smallSide, largeSide, false /* isLandscape */);
但是通过打印log获取icon图标的大小和hotseatBarSizePx大小进行比较,未有相应匹配的值;
在DeviceProfile中总共有三个地方给hotseatBarSizePx赋值;第二处是位于:即获取的是icon图标大小
/ Hotseat if (isVerticalBarLayout()) { hotseatBarSizePx = iconSizePx; }
第三处位于:通过打印log,未走此处
if (!isVerticalBarLayout() && isPhone && isTallDevice) { // We increase the hotseat size when there is extra space. // ie. For a display with a large aspect ratio, we can keep the icons on the workspace // in portrait mode closer together by adding more height to the hotseat. // Note: This calculation was created after noticing a pattern in the design spec. int extraSpace = getCellSize().y - iconSizePx - iconDrawablePaddingPx; hotseatBarSizePx += extraSpace - pageIndicatorSizePx; // Recalculate the available dimensions using the new hotseat size. updateAvailableDimensions(dm, res); }
那么为什么hotseatBarSizePx在竖屏状态下应该固定不变的180px,谁赋值给hotseatBarSizePx,让它变成200多px的?
希望有知道的博友能够多多指导!