当前位置: 首页 > article >正文

Android 12 Launcher3 去掉Hotseat

1.概述


   在12.0 产品定制化开发中 由产品需求Launcher3 页面布局的原因,要求Launcher3 需要去掉Hotseat 不显示Hotseat下面几个图标,而做满屏app的显示,从而达到美观的效果,下面就来分析去掉Hotseat从而实现这个功能

2.Launcher3 去掉Hotseat的核心类

packages/apps/Launcher3/res/layout/launcher.xml
packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java

3.Launcher3 去掉Hotseat的核心功能分析和实现

        在Launcher3中主页面就是launcher.xml只布局,hotseat布局也在这里面,所以隐藏hotseat可以从这里先看launcher.xml的布局。
首先看下launcher.xml的布局

3.1 launcher.xml  hotseat布局

<com.android.launcher3.LauncherRootView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto"
android:id="@+id/launcher"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.android.launcher3.dragndrop.DragLayer
    android:id="@+id/drag_layer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:importantForAccessibility="no">

    <!-- The workspace contains 5 screens of cells -->
    <!-- DO NOT CHANGE THE ID -->
    <com.android.launcher3.Workspace
        android:id="@+id/workspace"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:theme="@style/HomeScreenElementTheme"
        launcher:pageIndicator="@+id/page_indicator" />

    <include layout="@layout/memoryinfo_ext" />

    <!-- DO NOT CHANGE THE ID -->
    <include
        android:id="@+id/hotseat"
        layout="@layout/hotseat" />

    <include
        android:id="@+id/overview_panel"
        layout="@layout/overview_panel"
        android:visibility="gone" />

    <!-- Keep these behind the workspace so that they are not visible when
     we go into AllApps -->
    <com.sprd.ext.pageindicators.WorkspacePageIndicatorLine
        android:id="@+id/page_indicator"
        android:layout_width="match_parent"
        android:layout_height="@dimen/vertical_drag_handle_size"
        android:layout_gravity="bottom"
        android:theme="@style/HomeScreenElementTheme" />

    <include
        android:id="@+id/page_indicator_customize"
        layout="@layout/page_indicator_customize" />

    <include
        android:id="@+id/drop_target_bar"
        layout="@layout/drop_target_bar" />

    <include
        android:id="@+id/scrim_view"
        layout="@layout/scrim_view" />

    <include
        android:id="@+id/apps_view"
        layout="@layout/all_apps"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</com.android.launcher3.dragndrop.DragLayer>

</com.android.launcher3.LauncherRootView>

从布局中可以看到android:id="@+id/hotseat"就是hotseat布局,所以隐藏hotseat就是需要设置属性为gone。

<include
        android:id="@+id/hotseat"
        layout="@layout/hotseat"
        android:visibility="gone" />

3.2 DeviceProfile.java 关于hotseat高度的修改

public DeviceProfile(Context context, InvariantDeviceProfile inv,
Point minSize, Point maxSize,
int width, int height, boolean isLandscape, boolean isMultiWindowMode) {
    this.inv = inv;
    this.isLandscape = isLandscape;
    this.isMultiWindowMode = isMultiWindowMode;

    // Determine sizes.
    widthPx = width;
    heightPx = height;
    if (isLandscape) {
        availableWidthPx = maxSize.x;
        availableHeightPx = minSize.y;
    } else {
        availableWidthPx = minSize.x;
        availableHeightPx = maxSize.y;
    }

    Resources res = context.getResources();
    DisplayMetrics dm = res.getDisplayMetrics();

    // Constants from resources
    isTablet = res.getBoolean(R.bool.is_tablet);
    isLargeTablet = res.getBoolean(R.bool.is_large_tablet);
    isPhone = !isTablet && !isLargeTablet;
    aspectRatio = ((float) Math.max(widthPx, heightPx)) / Math.min(widthPx, heightPx);
    boolean isTallDevice = Float.compare(aspectRatio, TALL_DEVICE_ASPECT_RATIO_THRESHOLD) >= 0;

    // Some more constants
    transposeLayoutWithOrientation =
            res.getBoolean(R.bool.hotseat_transpose_layout_with_orientation);

    context = getContext(context, isVerticalBarLayout()
            ? Configuration.ORIENTATION_LANDSCAPE
            : Configuration.ORIENTATION_PORTRAIT);
    res = context.getResources();

    edgeMarginPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin);
    desiredWorkspaceLeftRightMarginPx = isVerticalBarLayout() ? 0 : edgeMarginPx;

    int cellLayoutPaddingLeftRightMultiplier = !isVerticalBarLayout() && isTablet
            ? PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER : 1;
    int cellLayoutPadding = res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_padding);
    if (isLandscape) {
        cellLayoutPaddingLeftRightPx = 0;
        cellLayoutBottomPaddingPx = cellLayoutPadding;
    } else {
        cellLayoutPaddingLeftRightPx = cellLayoutPaddingLeftRightMultiplier * cellLayoutPadding;
        cellLayoutBottomPaddingPx = 0;
    }

    verticalDragHandleSizePx = res.getDimensionPixelSize(
            R.dimen.vertical_drag_handle_size);
    verticalDragHandleOverlapWorkspace =
            res.getDimensionPixelSize(R.dimen.vertical_drag_handle_overlap_workspace);

    IconLabelController ilc = LauncherAppMonitor.getInstance(context).getIconLabelController();
    maxIconLabelLines = ilc != null ?
            ilc.getIconLabelLine() : IconLabelController.MIN_ICON_LABEL_LINE;

    iconDrawablePaddingOriginalPx =
            res.getDimensionPixelSize(R.dimen.dynamic_grid_icon_drawable_padding);
    dropTargetBarSizePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_drop_target_size);
    workspaceSpringLoadedBottomSpace =
            res.getDimensionPixelSize(R.dimen.dynamic_grid_min_spring_loaded_space);

    workspaceCellPaddingXPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_padding_x);

    hotseatBarTopPaddingPx =
            res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_top_padding);
    hotseatBarBottomPaddingPx = (isTallDevice ? 0
            : res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_non_tall_padding))
            + res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_padding);
    hotseatBarSidePaddingEndPx =
            res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_side_padding);
    // Add a bit of space between nav bar and hotseat in vertical bar layout.
    hotseatBarSidePaddingStartPx = isVerticalBarLayout() ? verticalDragHandleSizePx : 0;
    hotseatBarSizePx = ResourceUtils.pxFromDp(inv.iconSize, dm) + (isVerticalBarLayout()
            ? (hotseatBarSidePaddingStartPx + hotseatBarSidePaddingEndPx)
            : (res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_extra_vertical_size)
                    + hotseatBarTopPaddingPx + hotseatBarBottomPaddingPx));
  ....

}

在DeviceProile构造函数中的hotseatBarSizePx 就是设置的导航栏高度,在这里构建hotseat布局的时候,可以通过设置这个高度了布后hotseatBarSizePx就是hotseat的高度
直接设为0即可
修改如下:

hotseatBarSizePx = 0/*ResourceUtils.pxFromDp(inv.iconSize, dm) + (isVerticalBarLayout()? (hotseatBarSidePaddingStartPx + hotseatBarSidePaddingEndPx): (res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_extra_vertical_size)+ hotseatBarTopPaddingPx + hotseatBarBottomPaddingPx))*/;


http://www.kler.cn/a/306570.html

相关文章:

  • Android 10 默认授权安装app运行时权限(去掉运行时所有权限授权弹窗)
  • 比ChatGPT更酷的AI工具
  • linux设置主机名
  • LLMs 如何处理相互矛盾的指令?指令遵循优先级实验
  • openSUSE 环境下通过 zypper 安装软件
  • uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
  • JVM 调优篇7 调优案例3- gc overhead limit exceed
  • ListBox显示最新数据、左移和右移操作
  • K8s中HPA自动扩缩容及hml
  • idea2024.2永久使用
  • MFC工控项目实例之十五定时刷新PC6325A模拟量输入
  • HTML添加文字
  • 【深度学习】Pytorch基础
  • 分享一些成功的 SQL 优化案例
  • 2024工业机器视觉产业现状
  • 多模态大语言模型综述(中)-算法实用指南
  • 如何在Django中创建新的模型实例
  • MFC工控项目实例之十六输入信号验证
  • app抓包 chrome://inspect/#devices
  • 2024.9.12(k8s环境搭建2)
  • WebSocket vs. Server-Sent Events:选择最适合你的实时数据流技术
  • VUE3中ref与reactive
  • Sentinel 安装
  • BSV区块链上的覆盖网络服务现已开放公测
  • 常回家看看之house_of_cat
  • 基于单片机的超声波液位检测系统(论文+源码)