Android11.0 launcher修改为单层

这篇具有很好参考价值的文章主要介绍了Android11.0 launcher修改为单层。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OS: RK3568 Android11.0

现在的产品基本都是按照手机样式去做,所以需要把系统默认的Launcher样式,去掉抽屉改为单层显示,也就是把所有的app添加到workspace中。
以下修改是在设备横屏模式下进行

1.添加一个宏开关控制Launcher单双层显示
  • 源码: /packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java
 /**
  * true: All applications are displayed in the workspace. Turn off the display of the allapp list
  */
  public static final boolean REMOVE_DRAWER  = true;
2.去掉Qsb
  • 源码: /packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java
public static final boolean QSB_ON_FIRST_SCREEN = false/*!Utilities.isEinkProduct()*/;

将这个宏改为false,第一页顶部的搜索框就不会显示了

3.加载所有app到workspace中并排序
  • 源码:packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java
 // add start
 import com.android.launcher3.allapps.AppInfoComparator;
 import android.util.Pair;
 // end
 
 public void run() {
     synchronized (this) {
         // Skip fast if we are already stopped.
         if (mStopped) {
             return;
         }
     }
     ...
     // second step
     List<LauncherActivityInfo> allActivityList = loadAllApps();
     logger.addSplit("loadAllApps");
     
     // add start
     if (FeatureFlags.REMOVE_DRAWER) {
         bindAllAppsToWorkspace();
     }
     // add end
     
     verifyNotStopped();
     mResults.bindAllApps();
     logger.addSplit("bindAllApps");
     ...
 }    

 // add start
 private void bindAllAppsToWorkspace(){
     if (mBgAllAppsList.data.size() > 0) {
         AppInfoComparator mAppNameComparator = new AppInfoComparator(mApp.getContext());
         ArrayList<AppInfo> appInfos = new ArrayList<AppInfo>(mBgAllAppsList.data);
         // 按照名称进行排序
         Collections.sort(appInfos, mAppNameComparator);
         ArrayList<Pair<ItemInfo, Object>> installQueue = new ArrayList<>();
         for (AppInfo info : appInfos) {
              installQueue.add(Pair.create((ItemInfo) info, null));
         }
         mApp.getModel().addAndBindAddedWorkspaceItems(installQueue);
     }
 }
 // end

loadAllApps()中会获取所有应用数据,在添加的bindAllAppsToWorkspace方法中将获取的应用数据按名称排序,然后调用addAndBindAddedWorkspaceItems方法开始app数据与workspace的绑定,处理逻辑在AddWorkspaceItemsTask中进行。

4.系统应用不在workspace中显示
  • 源码: /packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
 @Override
 public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
     if (mItemList.isEmpty()) {
         return;
     }
     ...
     if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION ||
             item.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
         // Short-circuit this logic if the icon exists somewhere on the workspace
         if (shortcutExists(dataModel, item.getIntent(), item.user)) {
             continue;
         }
         
         // add start     
         if (!FeatureFlags.REMOVE_DRAWER) {
             // b/139663018 Short-circuit this logic if the icon is a system app
             if (PackageManagerHelper.isSystemApp(app.getContext(), item.getIntent())) {
                 continue;
             }
         }
         // add end
     }

在开始处理的时候会判断,如果是系统应用会被忽略,所以我们要把这步跳过去。

5.Hotseat中的应用不在workspace中显示
  • 源码:packages/apps/Launcher3/src/com/android/launcher3/model/LoaderCursor.java
 protected boolean checkItemPlacement(ItemInfo item) {
     int containerIndex = item.screenId;
     if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
         // add start
         if (FeatureFlags.REMOVE_DRAWER) {
             return false;
         }
         // add end
         final GridOccupancy hotseatOccupancy =
                 occupied.get(LauncherSettings.Favorites.CONTAINER_HOTSEAT);
		 ...

默认在hotseat中的应用不会被添加到workspace中,属于hotseat的应用的container值是-101,所以在此处根据宏做处理或者注释掉default_workspace_xx.xml中launcher:container=“-101”的项

6.所有应用不在第一页显示
  • 源码: /packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
 protected int[] findSpaceForItem( LauncherAppState app, BgDataModel dataModel,
         IntArray workspaceScreens, IntArray addedWorkspaceScreensFinal, int spanX, int spanY) {
         ...
         
        // Find appropriate space for the item.
        int screenId = 0;
        int[] cordinates = new int[2];
        boolean found = false;

        int screenCount = workspaceScreens.size();
        // First check the preferred screen.
        int preferredScreenIndex = workspaceScreens.isEmpty() ? 0 : 1;
        // add start
        if (FeatureFlags.REMOVE_DRAWER) {
            preferredScreenIndex = 0;
        }
        // add end
        if (preferredScreenIndex < screenCount) {
            screenId = workspaceScreens.get(preferredScreenIndex);
            found = findNextAvailableIconSpaceInScreen(
                    app, screenItems.get(screenId), cordinates, spanX, spanY);
        }

这个方法是添加item到workspace中时判断当前页是否有空余位置的,按照上面修改使绑定数据从workspace第一页开始。

7.app数据变化时,更新workspace
  • 源码:/packages/apps/Launcher3/src/com/android/launcher3/model/PackageUpdatedTask.java
 @Override
 public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList appsList) {
     final Context context = app.getContext();
     final IconCache iconCache = app.getIconCache();
     ...
     if (Utilities.ATLEAST_OREO && mOp == OP_ADD) {
         // Load widgets for the new package. Changes due to app updates are handled through
         // AppWidgetHost events, this is just to initialize the long-press options.
         for (int i = 0; i < N; i++) {
              dataModel.widgetsModel.update(app, new PackageUserKey(packages[i], mUser));
         }
         bindUpdatedWidgets(dataModel);
     }
     // add start
     if (FeatureFlags.REMOVE_DRAWER) {
         bindAllAppsToWorkspace(app, appsList);
     }
     // add end
 }
 
 // add start
 private void bindAllAppsToWorkspace(LauncherAppState app, AllAppsList mBgAllAppsList){
     if (mBgAllAppsList.data.size() > 0) {
         //  AppInfoComparator mAppNameComparator = new AppInfoComparator(mApp.getContext());
         ArrayList<AppInfo> appInfos = new ArrayList<AppInfo>(mBgAllAppsList.data);
         //  Collections.sort(appInfos, mAppNameComparator);
         ArrayList<Pair<ItemInfo, Object>> installQueue = new ArrayList<>();
         for (AppInfo info : appInfos) {
              installQueue.add(Pair.create((ItemInfo) info, null));
         }
         app.getModel().addAndBindAddedWorkspaceItems(installQueue);
     }
 }
 // add end
8.禁止上滑显示Allapp
  • 源码:/packages/apps/Launcher3/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java
 @Override
 public final boolean onControllerInterceptTouchEvent(MotionEvent ev) {
     if (ev.getAction() == MotionEvent.ACTION_DOWN) {
         mNoIntercept = !canInterceptTouch(ev);
         if (mNoIntercept) {
             return false;
         }
         ...  
     }
     // add start
     if (FeatureFlags.REMOVE_DRAWER) {
         return false;
     }
     // add end

     if (mNoIntercept) {
         return false;
     }

     onControllerTouchEvent(ev);
     return mDetector.isDraggingOrSettling();
 }
9.调整UI,去掉hotseat和AllApp button

去掉hotseat和Allapp按钮调整布局,设置workspace的行列

9.1 隐藏AllApp button
  • 源码:packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsTransitionController.java
 public void setupViews(AllAppsContainerView appsView, ScrimView scrimView) {
     mAppsView = appsView;
     mScrimView = scrimView;
     // add start
     if (FeatureFlags.REMOVE_DRAWER) {
         mScrimView.setVisibility(View.GONE);
     }
     // add end
     PluginManagerWrapper.INSTANCE.get(mLauncher)
            .addPluginListener(this, AllAppsSearchPlugin.class, false);
 }
9.2 去掉hotseat
  • 源码:/packages/apps/Launcher3/src/com/android/launcher3/Hotseat.java
 @Override
 public void setInsets(Rect insets) {
     FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
     DeviceProfile grid = mActivity.getDeviceProfile();
     ...
     // add start
     if (FeatureFlags.REMOVE_DRAWER) {
         lp.height = 0;
     }
     // add end
     setLayoutParams(lp);
     InsettableFrameLayout.dispatchInsets(this, insets);
 }

直接设置hotseat的高为0

9.3 横屏下workspace界面item的标题不显示
  • 源码:/packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java
 // 横屏下进入这里,会隐藏workspace中item的title
 if (isVerticalBarLayout()) {
     // Always hide the Workspace text with vertical bar layout.
     adjustToHideWorkspaceLabels();
 }
 ...
 public boolean isVerticalBarLayout() {
     return isLandscape && transposeLayoutWithOrientation;
 }
 ...
 public Builder(Context context, InvariantDeviceProfile inv, DefaultDisplay.Info info) {
     mContext = context;
     mInv = inv;
     mInfo = info;
     // add start
     if (FeatureFlags.REMOVE_DRAWER) {
         mTransposeLayoutWithOrientation = false;
     } else {
         mTransposeLayoutWithOrientation = context.getResources()
                 .getBoolean(R.bool.hotseat_transpose_layout_with_orientation);
     }
     // add end
 }

hotseat_transpose_layout_with_orientation为true,hotseat的位置会根据屏幕方向旋转改变,这里直接修改为false,相应的isVerticalBarLayout()方法也返回false。文章来源地址https://www.toymoban.com/news/detail-479216.html

9.4 调整workspace的item的图标和标题的距离
 private void updateIconSize(float scale, Resources res) {
     // Workspace
     ...
     if (iconDrawablePaddingPx > cellYPadding && !isVerticalLayout
             && !isMultiWindowMode) {
         // Ensures that the label is closer to its corresponding icon. This is not an issue
         // with vertical bar layout or multi-window mode since the issue is handled separately
         // with their calls to {@link #adjustToHideWorkspaceLabels}.
         cellHeightPx -= (iconDrawablePaddingPx - cellYPadding);
         iconDrawablePaddingPx = cellYPadding;
     }
     // add start
     if (FeatureFlags.REMOVE_DRAWER) {
         iconDrawablePaddingPx = 0;
     }
     // add end
     cellWidthPx = iconSizePx + iconDrawablePaddingPx;
9.5 调整workspace到屏幕底部的间隔距离
 private void updateWorkspacePadding() {
     Rect padding = workspacePadding;
     if (isVerticalBarLayout()) {
         padding.top = 0;
         padding.bottom = edgeMarginPx;
         if (isSeascape()) {
             padding.left = hotseatBarSizePx;
             padding.right = hotseatBarSidePaddingStartPx;
         } else {
             padding.left = hotseatBarSidePaddingStartPx;
             padding.right = hotseatBarSizePx;
         }
     } else {
     	 // add start
         if (FeatureFlags.REMOVE_DRAWER) {
             hotseatBarSizePx = 0;
         }
         // add end
         int paddingBottom = hotseatBarSizePx + workspacePageIndicatorHeight
                 - mWorkspacePageIndicatorOverlapWorkspace;
         ...
 }       
9.6. 修改workspace行列
  • 源码: packages/apps/Launcher3/src/com/android/launcher3/InvariantDeviceProfile.java
 private void initGrid(
         Context context, DefaultDisplay.Info displayInfo, DisplayOption displayOption) {
     GridOption closestProfile = displayOption.grid;
     numRows = closestProfile.numRows;
     numColumns = closestProfile.numColumns;
     // add start
     if (FeatureFlags.REMOVE_DRAWER) {
         numRows = 5;
         numColumns = 7;
     }
     // add end
10.修改workspace中的应用和文件拖拽移除为取消
  • 源码:/packages/apps/Launcher3/src/com/android/launcher3/DeleteDropTarget.java
 private boolean canRemove(ItemInfo item) {
      // ad start
      boolean remove = FeatureFlags.REMOVE_DRAWER ? !canCancel(item)
                  : item.id != ItemInfo.NO_ID;
      // add end
      return remove;
 }

 /**
  * Set mControlType depending on the drag item.
  */
 private void setControlTypeBasedOnDragSource(ItemInfo item) {
     mControlType = (FeatureFlags.REMOVE_DRAWER ? !canCancel(item) : 
         item.id != ItemInfo.NO_ID) ? ControlType.REMOVE_TARGET
             : ControlType.CANCEL_TARGET;
 }
 
 // add start
 private boolean canCancel(ItemInfo item){
     return (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION ||
          item.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER);
 }
 // add end
  • 源码:/packages/apps/Launcher3/src/com/android/launcher3/dragndrop/DragController.java
 private void drop(DropTarget dropTarget, Runnable flingAnimation) {
      ...
      // Drop onto the target.
        boolean accepted = false;
        if (dropTarget != null) {
            dropTarget.onDragExit(mDragObject);
            if (dropTarget.acceptDrop(mDragObject)) {
                if (flingAnimation != null) {
                    flingAnimation.run();
                } else {
                    dropTarget.onDrop(mDragObject, mOptions);
                }
                // add start
                if (FeatureFlags.REMOVE_DRAWER) {
                    if (dropTarget instanceof DeleteDropTarget && canCancel(mDragObject.dragInfo)) {
                        cancelDrag();
                    }
                }
                // add end
                accepted = true;
            }
        }
        ...
 }
 
 // add start
 private boolean canCancel(ItemInfo item){
      return (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION ||
          item.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER);
 } 
 //add end

到了这里,关于Android11.0 launcher修改为单层的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568 android11 调试mipi摄像头 gc2093

    GC2093是一个高质量的1080P CMOS图像传感器,用于安全相机产品、数码相机产品和手机相机应用程序。包含了一个1920H x 1080V像素阵列、片上10位ADC和图像信号处理器。高性能和低功耗功能的全面集成使GC2093最适合设计,减少了实现过程,并延长了运动相机、汽车DVR和各种移动应用

    2024年01月17日
    浏览(65)
  • Android 9.0 Launcher3去掉抽屉模式 双层改成单层系列一

      在9.0的系统产品开发中,在Launcher3中系统默认是上滑抽屉模式,通过上滑可以拉出app列表页,产品需求要求改成去掉上滑抽屉模式 就是改成单层模式,所以本系列就来讲解下双层改单层系列第一讲

    2024年02月03日
    浏览(41)
  • Android 11.0 动态修改SystemProperties中ro开头系统属性的值

    需求: 在11.0的产品开发中,对于定制功能的需求很多,有些机型要求可以修改系统属性值,对于系统本身在10.0以后为了系统安全性,不允许修改ro开头的SystemProperties的值,所以如果要求修改ro的相关系统属性,就得看在设置SystemProperties的相关值的要求,修改这部分要求就可

    2024年02月05日
    浏览(90)
  • Android 13.0 Launcher3定制之双层改单层(去掉抽屉式四)

     在13.0的系统产品开发中,对于在Launcher3中的抽屉模式中,系统默认的就是抽屉单层模式,但是在很多产品中需要默认为单层模式,就是要求去掉双层抽屉模式,接下来看下如何继续实现去掉抽屉双层模式,来变成单层模式第四节 Launcher3定制之双层改单层(去掉抽屉式四)的功

    2024年02月09日
    浏览(80)
  • Android 13.0 Launcher3定制之双层改单层(去掉抽屉式二)

      在13.0的系统产品开发中,对于在Launcher3中的抽屉模式也就是双层模式,在系统原生的Launcher3中就是双层抽屉模式的, 但是在通过抽屉上滑的模式拉出app列表页,但是在一些产品开发中,对于单层模式的Launcher3的产品模式也是常用的功能, 所以需要了解抽屉模式,然后修改

    2024年02月09日
    浏览(46)
  • RK3568 android11 移植 v4l2loopback 虚拟摄像头

    v4l2loopback是一个Linux内核模块,它允许用户创建虚拟视频设备。这种虚拟视频设备可以用于各种用途,例如将实际摄像头的视频流复制到虚拟设备上,或者用于视频流的处理和分析等。v4l2loopback的主要作用是 创建一个虚拟的Video4Linux2设备,它可以接收来自其他应用程序的视频

    2024年01月19日
    浏览(64)
  • Android 11.0 系统修改usb连接电脑mtp和PTP的显示名称

      在11.0的系统产品rom定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的方法来解决这个问题 MTP的全称

    2024年01月17日
    浏览(52)
  • RK3568 android11 实现双路I2C触摸 --GT9xx

    它的接口类型为 I2C ,供电电压和通讯电压均为 3.3V 。这款电容触摸屏内置了上拉电阻,这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。 关于线序,同样是 GT911 ,不同批次的器件都有不同的线序。具体的要自行与厂家确认。 调试双I2C触摸,两个tp是同一型

    2024年01月18日
    浏览(49)
  • rk3568 修改开机动画

    bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。 bootanimation.zip

    2024年02月03日
    浏览(41)
  • RK3568 安卓11系统EDP屏调试

    目录 一.lcd屏解析: 二.EDP配置 2.1 硬件原理分析 2.2 datasheet分析 2.3 完整DTS配置如下:  一般屏的规格书都会给出,但需要注意的是,有些规格书是错误的;有一些未给出(需要单独找厂商要);还有一些是给出总的,HFP+HS+HBP, VFP+VS+VBP。 clock-frequency: 提供给lcd的时钟频率,一般屏

    2024年02月09日
    浏览(88)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包