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的?

希望有知道的博友能够多多指导!

更多相关文章

  1. Android移动开发之【Android实战项目】渐变的TextView小漂亮代码
  2. SQlite与android 的数据交互 (android 项目心得三)
  3. 问题:在运行android的项目时出现的异常
  4. Android项目中如果json字符串中key-value顺序很重要,不要使用Andr
  5. Android Support Library 介绍~在项目总如何使用android支持库
  6. 关于ADT(eclipse android)项目迁移到Android studio工具教程(下)
  7. android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目
  8. 在android 中导入项目后 包出现错误
  9. Android 开发入门问题集:启动模拟器、安装卸载apk、项目调试、导

随机推荐

  1. 将DOMDocument中的特定元素导出为字符串
  2. header("Content-type:text/html;charset
  3. 如果key在变量中,PHP如何从数组中获取值
  4. CakePHP错误:在Acl中找不到类'String'
  5. php 无限级分类 递归+sort排序 和 非递归
  6. 如何捕获错误,如无法打开流和连接超时
  7. AJAX调用在JavaScript中运行PHP脚本
  8. 自动同步vps服务器或本地文件的数据到百
  9. php如何判断数组["a","b","c"]中是否含有
  10. wamp如何添加多个站点