Android13-Launcer3_Hotseat-隐藏

616 阅读2分钟

未隐藏前

Untitled.png

Launcher

是桌面的Activity,管理和展示桌面的应用图标,它的布局文件是Launcher.xml

Launcher.xml布局文件

<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">

        <com.android.launcher3.views.AccessibilityActionsView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/home_screen"
            />

        <!-- 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" />

        <!-- DO NOT CHANGE THE ID -->
        <!--Hotseat的布局        -->
        <include
            android:id="@+id/hotseat"
            android:visibility="gone"
            layout="@layout/hotseat" />

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

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

        <com.android.launcher3.views.ScrimView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/scrim_view"
            android:background="@android:color/transparent" />

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

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

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

</com.android.launcher3.LauncherRootView>

单纯的添加android:visibility="gone”并不能隐藏Hotseat

Launcher在onCreate()方法时候通过initDeviceProfile()方法会初始化DeviceProfile

DeviceProfile用来配置Icon大小、间距,也用来配置Hotseat的高度、内容大小

DeviceProfile的Builder

        public DeviceProfile build() {
            if (mWindowBounds == null) {
                throw new IllegalArgumentException("Window bounds not set");
            }
            if (mTransposeLayoutWithOrientation == null) {
                mTransposeLayoutWithOrientation = !mInfo.isTablet(mWindowBounds);
            }
            if (mIsGestureMode == null) {
                mIsGestureMode = mInfo.navigationMode.hasGestures;
            }
            if (mDotRendererCache == null) {
                mDotRendererCache = new SparseArray<>();
            }
            if (mViewScaleProvider == null) {
                mViewScaleProvider = DEFAULT_PROVIDER;
            }
            return new DeviceProfile(mContext, mInv, mInfo, mWindowBounds, mDotRendererCache,
                    mIsMultiWindowMode, mTransposeLayoutWithOrientation, mIsMultiDisplay,
                    mIsGestureMode, mViewScaleProvider);
        }
    DeviceProfile(Context context, InvariantDeviceProfile inv, Info info, WindowBounds windowBounds,
            SparseArray<DotRenderer> dotRendererCache, boolean isMultiWindowMode,
            boolean transposeLayoutWithOrientation, boolean isMultiDisplay, boolean isGestureMode,
            @NonNull final ViewScaleProvider viewScaleProvider) {
            
            ...
		        if (inv.folderStyle != INVALID_RESOURCE_HANDLE) {
		            TypedArray folderStyle = context.obtainStyledAttributes(inv.folderStyle,
		                    R.styleable.FolderDisplayStyle);
		            // These are re-set in #updateFolderCellSize if the grid is not scalable
		            folderCellHeightPx = folderStyle.getDimensionPixelSize(
		                    R.styleable.FolderDisplayStyle_folderCellHeight, 0);
		            folderCellWidthPx = folderStyle.getDimensionPixelSize(
		                    R.styleable.FolderDisplayStyle_folderCellWidth, 0);
		
		            folderContentPaddingTop = folderStyle.getDimensionPixelSize(
		                    R.styleable.FolderDisplayStyle_folderTopPadding, 0);
		            folderCellLayoutBorderSpacePx = folderStyle.getDimensionPixelSize(
		                    R.styleable.FolderDisplayStyle_folderBorderSpace, 0);
		            folderFooterHeightPx = folderStyle.getDimensionPixelSize(
		                    R.styleable.FolderDisplayStyle_folderFooterHeight, 0);
		            folderStyle.recycle();
		        } else {
		            folderCellLayoutBorderSpacePx = 0;
		            folderFooterHeightPx = 0;
		            folderContentPaddingTop = res.getDimensionPixelSize(R.dimen.folder_top_padding_default);
		        }
		        
				    cellLayoutBorderSpacePx = getCellLayoutBorderSpace(inv);
		        cellLayoutBorderSpaceOriginalPx = new Point(cellLayoutBorderSpacePx);
		        allAppsBorderSpacePx = new Point(
		                pxFromDp(inv.allAppsBorderSpaces[mTypeIndex].x, mMetrics),
		                pxFromDp(inv.allAppsBorderSpaces[mTypeIndex].y, mMetrics));
		
		        workspacePageIndicatorHeight = res.getDimensionPixelSize(
		                R.dimen.workspace_page_indicator_height);
		        mWorkspacePageIndicatorOverlapWorkspace =
		                res.getDimensionPixelSize(R.dimen.workspace_page_indicator_overlap_workspace);
		        ...
				    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() ? workspacePageIndicatorHeight : 0;
		        //这里是修改Hotseat的高度
		        updateHotseatSizes(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics));
		        
    private void updateHotseatSizes(int hotseatIconSizePx) {
        // Ensure there is enough space for folder icons, which have a slightly larger radius.
        hotseatCellHeightPx = (int) Math.ceil(hotseatIconSizePx * ICON_OVERLAP_FACTOR);

        if (isVerticalBarLayout()) {
            hotseatBarSizePx = hotseatIconSizePx + hotseatBarSidePaddingStartPx
                    + hotseatBarSidePaddingEndPx;
        } else if (isQsbInline) {
            hotseatBarSizePx = Math.max(hotseatIconSizePx, hotseatQsbVisualHeight)
                    + hotseatBarBottomSpacePx;
        } else {
            hotseatBarSizePx = hotseatIconSizePx
                    + hotseatQsbSpace
                    + hotseatQsbVisualHeight
                    + hotseatBarBottomSpacePx;
        }
        //这里直接赋值为0,可以实现隐藏效果
        hotseatBarSizePx = 0;
    }

效果

Untitled 1.png