Launcher3 模块的简单设计

article/2025/11/7 3:10:22

Launcher3 模块的简单设计

Lancher3 路劲: Z:\xxx\packages\apps\Launcher3

任务

1、AllApps背景透明化。
2、Allapps前3个图标变为Chrome、youtube、play商店。
3、长按桌面空白处在弹出的按钮下添加一个图标变大按钮,一个图标变小按钮,点击按钮图标变大或变小。
4、APP 标题两行显示
5、后台任务界面添加一个按钮,点击弹出吐司,默认图标为方形。。

单编

Linux 指令

  1. cd (项目目录)

  2. source build/envsetup.sh

  3. lunch xxx-userdebug-gms trunk

  4. make Launcher3QuickStepGo

push

adb root
adb remount
adb push Z:\xxx\out\target\product\xxx\system_ext\priv-app\Launcher3QuickStepGo\Launcher3QuickStepGo.apk /system_ext/priv-app/Launcher3QuickStepGo/
adb reboot

任务 1

思路:先利用 uiautomatorviewer.bat 工具找到能够包括抽屉模式背景的最小背景布局

请添加图片描述

修改布局背景时不应在对应 xml 中使用 background ,而应该在清单文件 AndroidManifest.xml中修改主题。

路径: apps/Launcher3/res/values/styles.xml
修改:<item name="allAppsScrimColor">#01000000</item>

任务 2

Allapps前3个图标变为Chrome、youtube、play商店。

Chrome应用路径: Z:\xxx\out\target\product\xxx\product\app\Chrome

注意:严格按照所提供的模板 空格与 / 需注意!!!

修改路径: packages\apps\Launcher3\ext\res\xml\arrays.xml

    <!-- Add for customize app position feature: start --><string-array name="customize_app_position" translatable="false"><!-- ex: packageName/className#position --><!-- ex: com.android.settings/#0  --><item> com.android.chrome/#0</item><item> com.google.android.youtube/#1</item><item> com.android.vending/#2</item></string-array><!-- Add for customize app position feature: end -->

在 com 命令行窗口输入 adb shell am monitor

请添加图片描述

利用此命令可以获取 apk 的包名。

任务 3

长按桌面空白处在弹出的按钮下添加一个图标变大按钮,一个图标变小按钮,点击按钮图标变大或变小。

请添加图片描述

查询后找到 OptionsPopupView.java 文件, 路径:Z:\xxx\packages\apps\Launcher3\src\com\android\launcher3\views\OptionsPopupView.java

在下述方法 showDefaultOptions(Launcher launcher, float x, float y) 中添加 PopupView, 并且对相应 string 进行定义。

showDefaultOptions(Launcher launcher, float x, float y)options.add(new OptionItem(R.string.icon_bigger_button_text,R.drawable.ic_setting,LAUNCHER_SELECT_MODE_RESIZE_BIGGER_ICON, OptionsPopupView::biggerIconSizePx));options.add(new OptionItem(R.string.icon_smaller_button_text,R.drawable.ic_setting, LAUNCHER_SELECT_MODE_RESIZE_SMALLER_ICON, OptionsPopupView::smallerIconSizePx));

思路是通过 PopupView 的点击事件发送广播

    private static finalString BIGGER_ICONPX_ACTION ="com.android.launcher3.views.OptionsPopupView_bigger";private static finalString SMALLER_ICONPX_ACTION ="com.android.launcher3.views.OptionsPopupView_smaller";public static boolean biggerIconSizePx(View view){Launcher launcher = Launcher.getLauncher(view.getContext());Intent intent = new Intent();intent.setAction(BIGGER_ICONPX_ACTION);launcher.sendBroadcast(intent);return true;}public static boolean smallerIconSizePx(View view){Launcher launcher = Launcher.getLauncher(view.getContext());Intent intent = new Intent();intent.setAction(SMALLER_ICONPX_ACTION);launcher.sendBroadcast(intent);return true;}

DeviceProfile.java 文件对广播进行接受, 路径:Z:\xxx\packages\apps\Launcher3\src\com\android\launcher3\DeviceProfile.java

    private int mResize;private Context mContext;private static finalString BIGGER_ICONPX_ACTION ="com.android.launcher3.views.OptionsPopupView_bigger";private static finalString SMALLER_ICONPX_ACTION ="com.android.launcher3.views.OptionsPopupView_smaller";// 构造器中注册广播并且获取上下文ResizeIconPx resizeIconPx = new ResizeIconPx();IntentFilter filter = new IntentFilter();filter.addAction(BIGGER_ICONPX_ACTION);filter.addAction(SMALLER_ICONPX_ACTION);context.registerReceiver(resizeIconPx, filter);mContext = context;
// 该方法为更新图标方法,在此方法中对图标大小进行改变且存储
updateIconSize(float scale, Resources res)mResize = Settings.Global.getInt(mContext.getContentResolver(), "ChangeValue", 0);Toast.makeText(mContext, "mResize"+mResize, Toast.LENGTH_SHORT).show();iconSizePx = Math.max(1, (int) (ResourceUtils.pxFromDp(invIconSizeDp, mInfo.metrics)* scale) + mResize);// 用内部类对广播进行实现并接受发送过来的广播public class ResizeIconPx extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(BIGGER_ICONPX_ACTION)){mResize += 5;Settings.Global.putInt(context.getContentResolver(), "ChangeValue", mResize);updateIconSize(1f,context.getResources());System.out.println("变大" + mResize);}else if(intent.getAction().equals(SMALLER_ICONPX_ACTION)){mResize -= 5;Settings.Global.putInt(context.getContentResolver(), "ChangeValue", mResize);updateIconSize(1f,context.getResources());System.out.println("变小" + mResize);}LauncherAppState app = LauncherAppState.getInstanceNoCreate();if (app != null) {app.getModel().forceReload();}}}

任务 4

APP 标题两行显示

查阅文档可知:

修改路径:Launcher3\res\values\config_ext.xml

<!== add for app icon label display double lines ==>
<bool name="enable_icon_label_show_double_lines">false</bool>

另外需要将此功能的实现进行开启,否则无法实现功能

    private static boolean getProp(String prop) {return getProp(prop, true);}

任务 5

后台任务界面添加一个按钮,点击弹出吐司,默认图标为方形。

思路:先找到相似的按钮,并且找到其实现方法,仿照实现点击吐司的功能。

请添加图片描述

根据 id 找到了 屏幕截图的 xml 文件, 路径:**Z:\xxx\packages\apps\Launcher3\quickstep\res\layout\overview_actions_container.xml **

        <Buttonandroid:id="@+id/action_screenshot"style="@style/OverviewActionButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:drawableStart="@drawable/ic_screenshot"android:text="@string/action_screenshot"android:theme="@style/ThemeControlHighlightWorkspaceColor" />

对其进行仿写,并且对所需要的 string 进行定义。

        <Buttonandroid:id="@+id/action_change_icon_style"style="@style/OverviewActionButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/action_change_icon_style" />

布局实现后,对其功能进行实现, 根据 xml 的 id 查询其被调用的文件。路径: Z:\xxx\packages\apps\Launcher3\quickstep\recents_ui_overrides\src\com\android\quickstep\views\OverviewActionsView.java

设置点击事件

    @Overrideprotected void onFinishInflate() {super.onFinishInflate();View share = findViewById(R.id.action_share);share.setOnClickListener(this);findViewById(R.id.action_screenshot).setOnClickListener(this);findViewById(R.id.action_change_icon_style).setOnClickListener(this);if (ENABLE_OVERVIEW_SHARE.get()) {share.setVisibility(VISIBLE);findViewById(R.id.share_space).setVisibility(VISIBLE);}}

实现点击事件, 发现仅仅只是调用,所以存在另一个类对方法进行具体实现。

    @Overridepublic void onClick(View view) {if (mCallbacks == null) {return;}int id = view.getId();if (id == R.id.action_share) {mCallbacks.onShare();} else if (id == R.id.action_screenshot) {mCallbacks.onScreenshot();}else if (id == R.id.action_change_icon_style){mCallbacks.onChange();}}

方法具体实现以及添加接口的定义, 路径: Z:\xxx\packages\apps\Launcher3\quickstep\recents_ui_overrides\src\com\android\quickstep\TaskOverlayFactory.java

/*** Called when the current task is interactive for the user*/public void initOverlay(Task task, ThumbnailData thumbnail, Matrix matrix,boolean rotated) {final boolean isAllowedByPolicy = thumbnail.isRealSnapshot;getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated);getActionsView().setCallbacks(new OverlayUICallbacks() {@Overridepublic void onShare() {if (isAllowedByPolicy) {mImageApi.startShareActivity();} else {showBlockedByPolicyMessage();}}@SuppressLint("NewApi")@Overridepublic void onScreenshot() {saveScreenshot(task);}@Overridepublic void onChange(){Toast.makeText(mApplicationContext, "Start monitoring", Toast.LENGTH_SHORT).show();}});}public interface OverlayUICallbacks {/** User has indicated they want to share the current task. */void onShare();/** User has indicated they want to screenshot the current task. */void onScreenshot();void onChange();}

默认图标的改变,首先根据自己的想法找到 IconSpace.java,路径:Z:\xxx\packages\apps\Launcher3\src\com\android\launcher3\graphics\IconShape.java

对其修改以及修改 config.xml 文件 将默认的圆形 修改 M50,0L92,0C96.42,0 100,4.58 100 8L100,92C100, 96.42 96.42 100 92 100L8 100C4.58, 100 0 96.42 0 92L0 8 C 0 4.42 4.42 0 8 0L50 0Z 后仍发现无效,需要在客制化中对其进行修改,路径:Z:\xxx\vendor\xxxx\xxx\trunk\overlay\frameworks\base\core\res\res\values

<?xml version="1.0" encoding="utf-8"?><resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><!-- Flag indicating whether round icons should be parsed from the application manifest. --><integer name="config_safe_media_volume_index">9</integer><bool name="config_useRoundIcon">true</bool><!-- Flag indicating whether we should enable the automatic brightness.Software implementation will be used if config_hardware_auto_brightness_available is not set --><bool name="config_automatic_brightness_available">false</bool><!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. --><string name="config_icon_mask" translatable="false">"M50,0L92,0C96.42,0 100,4.58 100 8L100,92C100, 96.42 96.42 100 92 100L8 100C4.58, 100 0 96.42 0 92L0 8 C 0 4.42 4.42 0 8 0L50 0Z"</string><bool name="config_intrusiveNotificationLed">false</bool><string translatable="false" name="config_ethernet_iface_regex"></string><integer name="config_screenBrightnessSettingDefault">255</integer><!--KDBAAN-386 R4 工具上verifier  fail--><string-array name="config_biometric_sensors" translatable="false" ><!-- <item>0:2:15</item>  ID0:Fingerprint:Strong --><item>0:8:4095</item> <!-- ID1:Face:Convenience --></string-array></resources>

http://chatgpt.dhexx.cn/article/qwOQwh9i.shtml

相关文章

android12.0(S) Launcher3 导入 AndroidStudio 调试编译

验证环境 aosp 12.0 源码&#xff0c;分支 android-12.0.0_r3 可以参考之前写的 android12.0(S) Pixel 3XL (QCOM 845) 编译刷机 AndroidStudio 版本 Android Studio Arctic Fox | 2020.3.1 Patch 4 gradle 版本 gradle-7.0.2-bin.zip gradle:7.0.4 二手 Pixel 3 XL一台可直…

launcher3的具体学习

目录结构&#xff1a; allapps 目录&#xff1a;主要存放主菜单界面相关代码。 anim目录&#xff1a;存放动画相关&#xff0c; badge目录&#xff1a;存放图标标识相关 compat目录&#xff1a;存放解决兼容性相关。 config目录&#xff1a;配置Launcher相关功能的宏开关 dragn…

Android10/11 原生Launcher3深度定制开发

一、引言 关于Android10和11系统Launcher3的定制有很多&#xff0c;根据项目的需求会进行各种定制开发&#xff0c; 于是就需要研究Launcher3的源码。本文主要从Android 11的Launcher3QuickStep着手 &#xff08;go版本或者其他版本类似&#xff09;从常用的修改进行分析&#…

Launcher3-桌面布局+主要的类+启动流程

一、launhcer3桌面布局二、launcher3主要的类LauncherModel&#xff1a;BubblTextView&#xff1a;DragController&#xff1a;LauncherAppState&#xff1a;DragView&#xff1a;DragSource&#xff0c;DropTarget&#xff1a;Folder&#xff1a;FolderIcon&#xff1a;Launch…

Launcher3--初识Launcher3

一、Launcher简介 Launcher时开机完成后第一个启动的应用&#xff0c;用来展示应用列表和快捷方式、小部件等。Launcher作为第一个(开机后第一个启动的应用)展示给用户的应用程序&#xff0c;其设计的好坏影响到用户的体验&#xff0c;甚至影响用户购机的判断。所以很多品牌厂商…

Android Launcher3分析及定制主题实现

一. Launcher3 简介 **launcher3是在Launcher2的基础上进化的版本,从Android 4.4 开始就使用Launcher3 .(kk版,kk2版)作为桌面使用,以前我们都在使用Launcher2,我们使用的是KK版本,具体区别后面再说. ** 1 Launcher3 桌面变成了动态管理,launcher2 里面默认最多加载五个worksp…

Android Launcher3简介

一.Launcher3概述 Launcher顾名思义&#xff0c;就是桌面的意思&#xff0c;也是android系统启动后第一个启动的应用程序&#xff0c;这里以android11为例&#xff0c;和其他应用并无区别&#xff0c;只是增加了对其他app和widget的管理窗口&#xff0c;且可以为用户定制化一些…

详细理解准确率、精准率、召回率,F1值等评价指标的含义

转载文章 原博客地址&#xff1a;详解准确率、精确率、召回率、F1值等评价指标的含义 机器学习问题之中&#xff0c;通常需要建立模型来解决具体问题&#xff0c;但对于模型的好坏&#xff0c;也就是模型的泛化能力&#xff0c;如何进行评估&#xff1f;我们可以定一些评价指标…

详解准确率、精确率、召回率、F1值等评价指标的含义

机器学习问题之中&#xff0c;通常需要建立模型来解决具体问题&#xff0c;但对于模型的好坏&#xff0c;也就是模型的泛化能力&#xff0c;如何进行评估呢&#xff1f; 很简单&#xff0c;我们可以定一些评价指标&#xff0c;来度量模型的优劣。比如准确率、精确率、召回率、…

分类性能评价指标——精确率,召回率,F1值详细解释

分类性能的评价指标 准确率 准确率是全部参与分类的文本中&#xff0c;与人工分类结果吻合的文本所占的比例。 即&#xff1a;预测与真实标签相同的比例 A c c u r a c y T P T N T P T N F P F N Accuracy\frac{TPTN}{TPTNFPFN} AccuracyTPTNFPFNTPTN​ 精确率 也称…

准确率、精确率、召回率、F1值

1.TP、TN、FP、FN 先粘一个官方形式的。 用新冠来举例理解。下方正方形为样本&#xff0c;其中 圆的部分认定为检测后是阳性的&#xff0c;其余部分为检测为阴性的&#xff08;但是现在的情况是检测并不完全准确&#xff0c;有可能检测时阴性&#xff0c;但实际上已经有新冠…

机器学习中的二分类问题评价指标之精确率、召回率、F1值通俗理解

引言&#xff1a;对于分类问题&#xff0c;我们在评估一个模型的好坏时&#xff0c;通常想到的是把该模型在测试集上分类结果正确的样本数量比上测试集的样本数量的比值结果&#xff0c;即准确率&#xff08;精确率&#xff09;作为评价准则。但除此之外&#xff0c;还有精确率…

【转】一些因素对F1值的影响

截自&#xff1a;https://blog.csdn.net/qq_27590277/article/details/88374695 https://blog.csdn.net/qq_27590277/article/details/88367082 一些因素对F1值的影响 如果还没了解F1值的话&#xff0c;这里有我之前写的通俗易懂的文章 详谈P(查准率)&#xff0c;R(查全率)&…

keras计算precision、recall、F1值

近期写课程作业&#xff0c;需要用Keras搭建网络层&#xff0c;跑实验时需要计算precision&#xff0c;recall和F1值&#xff0c;在前几年&#xff0c;Keras没有更新时&#xff0c;我用的代码是直接取训练期间的预测标签&#xff0c;然后和真实标签之间计算求解&#xff0c;代码…

F1值(F-Measure)、准确率(Precision)、召回率(Recall) 菜鸡版理解

前置知识&#xff1a; T&#xff08;True&#xff09;&#xff1a; 正确的 F (False) &#xff1a; 错误的 P (Positive) : 正向的/积极的 N (Negetive): 负向的/消极的 则&#xff1a; TP&#xff1a;正确的 预测了 正向的 FN&#xff1a;错误的 预测了 负向的 FP&#xff1a…

准确率、精确率、召回率、F1值学习笔记

一、TN、TP、TN、FP、FN概念 TP与TN都是分对了情况&#xff0c;TP是正类&#xff0c;TN是负类。则推断出&#xff0c;FP是错误的正类&#xff0c;FN是错误的负类。 举例&#xff1a;我们需要从一个班级中的人中寻找所有女生,如果把这个任务当成一个分类器的话,那么女生就是我们…

为何选用F1值(调和平均数)衡量P与R?

二分类问题的性能度量为何选用 F 1 F_1 F1​ 值&#xff1f; 已知混淆矩阵 prediction positiveprediction negativeactuality positiveTrue Positive(TP)False Negative(FN)actuality negativeFalse Positive(FP)True Negative(TN) 其中&#xff1a;Precise&#xff08;精…

精确度/召回率/F1值/Micro-F1和Macro-F1的理解

如下图所示&#xff0c;假设有若干张图片&#xff0c;其中12张是狗的图片其余是猫的图片&#xff0e;现在利用程序去识别狗的图片&#xff0c;结果在识别出的8张图片中有5张是狗的图片&#xff0c;3张是猫的图片&#xff08;属于误报&#xff09;&#xff0e; 图中&#xff0c;…

混淆矩阵、精确率、召回率、F1值、ROC曲线、AUC曲线

假设一个分类器A&#xff0c;分类器A的作用是告诉你一张图片是不是汉堡&#xff0c;我们如果想知道这个分类器的效果到底好不好&#xff0c;如何做&#xff1f; 最简单的方法就是将手机里所有的图片都扔给分类器A看&#xff0c;让分类器告诉我们哪些是汉堡 我们无法直观的看到…

python实现计算精度、召回率和F1值

python实现计算精度、召回率和F1值 摘要&#xff1a;在深度学习的分类任务中&#xff0c;对模型的评估或测试时需要计算其在验证集或测试集上的预测精度&#xff08;prediction/accuracy&#xff09;、召回率&#xff08;recall&#xff09;和F1值。本文首先简要介绍如何计算精…