MTK 安卓14 launcher3修改桌面模式,替换某些应用图标,以及定制化Hotseat

原生的launcher的Hotseat如下图(1)所示,我想把效果改成图(2)

图(1)

图(2)

一:定制化HotSeat

修改的类:packages/apps/Launcher3/com/android/launcher3/Hotseat.java

(1).修改hotseat的宽 Hotseat------->setInsets@Overridepublic void setInsets(Rect insets) {FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();DeviceProfile grid = mActivity.getDeviceProfile();//这是拖拽的是时候预览位图判断if (grid.isVerticalBarLayout()) {mQsb.setVisibility(View.GONE);lp.height = ViewGroup.LayoutParams.MATCH_PARENT;if (grid.isSeascape()) {lp.gravity = Gravity.LEFT;lp.width = grid.hotseatBarSizePx + insets.left;} else {lp.gravity = Gravity.RIGHT;lp.width = grid.hotseatBarSizePx + insets.right;}} else {mQsb.setVisibility(View.VISIBLE);//lp.gravity = Gravity.BOTTOM;//注释原本的//这两句不用管,下面会更改lp.width = ViewGroup.LayoutParams.MATCH_PARENT;lp.height = grid.hotseatBarSizePx;Log.e("TAG","Hotseat  with=========================="+grid.hotseatBarSizePx);//以下是新增的代码lp.gravity = Gravity.BOTTOM | Gravity.CENTER;WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);DisplayMetrics displayMetrics = new DisplayMetrics();if (windowManager != null) {windowManager.getDefaultDisplay().getMetrics(displayMetrics);int screenWidth = displayMetrics.widthPixels;Log.e("TAG","Hotseat  screenWidth=========================="+screenWidth);// 计算80%的宽度int desiredWidth = (int) (screenWidth * 0.8);Log.e("TAG","Hotseat  desiredWidth=========================="+desiredWidth);lp.width = desiredWidth;}//添加这一句把位置拉上去lp.bottomMargin = insets.bottom;}Rect padding = grid.getHotseatLayoutPadding(getContext());//setPadding(padding.left, padding.top, padding.right, padding.bottom);//因为底部的hotseat是占用全部的,所有这里我们把位置调节一下setPadding( (insets.bottom / 4), 0,  (insets.bottom / 4), 0);setLayoutParams(lp);InsettableFrameLayout.dispatchInsets(this, insets);}(2).修改hotseat的背景色,有个定制化颜色的框 这里我们用颜色来替代drawable------>hotseat_bg.xml<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#33FFFFFF"/>  <corners android:radius="10dp"/>  <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /></shape> 暂时修改为:<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#80FFFFFF"/>  <corners android:radius="20dp"/>  <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /></shape> 最后再在Hotseat初始化的地方添加:setBackgroundResource(R.drawable.hotseat_bg);

 二、替换图标(这里的图标我是直接放在mipmap里面)

(1).直接替换某些应用图标\packages\apps\Launcher3\src\com\android\launcher3\BubbleTextView\packages\apps\Launcher3\src\com\android\launcher3\BubbleTextView.java//先导包import com.android.launcher3.icons.LauncherIcons;import android.graphics.Bitmap;import com.android.launcher3.icons.BitmapInfo;import com.android.launcher3.icons.BitmapInfo.DrawableCreationFlags;import android.content.res.Resources;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import androidx.core.content.res.ResourcesCompat;import android.util.Log;//放入图片到mipmap//根据包名替换图片,新增方法convertBitmapInfoSpecialpublic BitmapInfo convertBitmapInfoSpecial(String packname){Resources resources = getContext().getResources();Drawable drawable = null;try {if (packname.equals("com.android.calculator2")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("calculator_icon", "mipmap", getContext().getPackageName()), null);} else if (packname.equals("com.android.soundrecorder")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("soundrecorder_icon", "mipmap", getContext().getPackageName()), null);} else if (packname.equals("com.android.calendar")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("calendar_icon", "mipmap", getContext().getPackageName()), null);} else if (packname.equals("com.android.settings")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("settings_icon", "mipmap", getContext().getPackageName()), null);} else if (packname.equals("com.android.camera2")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("camera_icon", "mipmap", getContext().getPackageName()), null);} else if (packname.equals("com.android.music")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("music_icon", "mipmap", getContext().getPackageName()), null);} else if (packname.equals("com.android.gallery3d")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("gallery3d_icon", "mipmap", getContext().getPackageName()), null);}if(drawable!=null){Bitmap bitmap = drawableToBitmap(drawable);LauncherIcons li = LauncherIcons.obtain(getContext());return li.createIconBitmap(bitmap);}else{return null;}} catch (Exception e) {Log.e("TAG", "没有获取到对应的包名======");}return null;}//在applyIconAndLabel里面替换图片@UiThreadprotected void applyIconAndLabel(ItemInfoWithIcon info) {int flags = shouldUseTheme() ? FLAG_THEMED : 0;if (mHideBadge) {flags |= FLAG_NO_BADGE;}//这几句是新增的 用于替换图片用BitmapInfo bitmapInfo = convertBitmapInfoSpecial(info.getTargetComponent().getPackageName());if (bitmapInfo != null){info.bitmap = bitmapInfo;}FastBitmapDrawable iconDrawable = info.newIcon(getContext(), flags);mDotParams.appColor = iconDrawable.getIconColor();mDotParams.dotColor = Themes.getAttrColor(getContext(), R.attr.notificationDotColor);setIcon(iconDrawable);applyLabel(info);}(2).第一步替换图片以后,发现在按住移动的时候会还原,那么我们找到按住显示图片的地方再修改一次\packages\apps\Launcher3\src\com\android\launcher3\Utilities.java//先导包import com.android.launcher3.icons.LauncherIcons;import android.graphics.Bitmap;import com.android.launcher3.icons.BitmapInfo;import com.android.launcher3.icons.BitmapInfo.DrawableCreationFlags;import android.content.res.Resources;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import androidx.core.content.res.ResourcesCompat;import android.util.Log;//根据包名替换图片,新增方法getDrawableSpecialpublic static Drawable getDrawableSpecial(Context context,String pckName) {Resources resources = context.getResources();Drawable drawable = null;try {if (pckName.equals("com.android.calculator2")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("calculator_icon", "mipmap", context.getPackageName()), null);} else if (pckName.equals("com.android.soundrecorder")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("soundrecorder_icon", "mipmap", context.getPackageName()), null);} else if (pckName.equals("com.android.calendar")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("calendar_icon", "mipmap", context.getPackageName()), null);} else if (pckName.equals("com.android.settings")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("settings_icon", "mipmap", context.getPackageName()), null);} else if (pckName.equals("com.android.camera2")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("camera_icon", "mipmap", context.getPackageName()), null);} else if (pckName.equals("com.android.music")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("music_icon", "mipmap", context.getPackageName()), null);} else if (pckName.equals("com.android.gallery3d")) {drawable = ResourcesCompat.getDrawable(resources, resources.getIdentifier("gallery3d_icon", "mipmap", context.getPackageName()), null);}return drawable;} catch (Exception e) {Log.e("TAG", "没有获取到对应的包名======");}return null;}//然后在loadFullDrawableWithoutTheme里面修改if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {LauncherActivityInfo activityInfo = context.getSystemService(LauncherApps.class).resolveActivity(info.getIntent(), info.user);outObj[0] = activityInfo;//这就是新增的 Drawable drawableSpecial = getDrawableSpecial(context,info.getTargetComponent().getPackageName());if (drawableSpecial == null){//这里是原本的代码,放到这里return activityInfo == null ? null : LauncherAppState.getInstance(context).getIconProvider().getIcon(activityInfo, activity.getDeviceProfile().inv.fillResIconDpi);}else{//如果找到了对应的包名,那么我们就替换图标return drawableSpecial;}//这里是原本的代码 我们先备份注释一份//return activityInfo == null ? null : LauncherAppState.getInstance(context)//  .getIconProvider().getIcon(//        activityInfo, activity.getDeviceProfile().inv.fillResIconDpi);}这时候图标不管移动还是显示都是正常的,但是替换图标以后会变大,我们尝试更改\frameworks\libs\systemui\iconloaderlib\src\com\android\launcher3\icons\BaseIconFactory.javapublic BitmapInfo createIconBitmap(Bitmap icon) {Log.e("TAG","createIconBitmap===============================================0.8");if (mIconBitmapSize != icon.getWidth() || mIconBitmapSize != icon.getHeight()) {//这里本来是1.0f的,我们改成0.8ficon = createIconBitmap(new BitmapDrawable(mContext.getResources(), icon), 0.8f);}return BitmapInfo.of(icon, mColorExtractor.findDominantColorByHue(icon));}

三:默认桌面模式(14的launcher3有抽屉模式以及桌面模式)

 修改的类:

vendor/sprd/platform/packages/apps/Launcher3/res_unisoc/values/config_ext.xml

因为安卓14的launcher3支持桌面模式以及抽屉模式切换,所以我们默认为桌面模式更改//修改的这个属性来设置抽屉还是没有抽屉模式 dual为抽屉模式 single为桌面模式<!--The value must be dual or single--><string name="default_home_screen_style" translatable="false">single</string>

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux cd 和 pwd 命令

目录 1. 更改工作目录 cd 2. 查看当前工作目录 pwd 1. 更改工作目录 cd 打开虚拟机终端的时候&#xff0c;以用户的家目录为默认工作目录&#xff1b; 更多时候需要更改当前的工作目录&#xff08;Change Directory&#xff09;, 语法&#xff1a;cd 【Linux路径】 没有参数…

Java 22 中的4个永久特性

功能处于孵化或预览阶段是什么意思&#xff1f; 实际上&#xff0c;这是向 Java 编程语言添加新功能的新过程&#xff0c;Java 社区使用这种过程来在 API 和工具处于早期实验阶段时从社区获得反馈&#xff08;孵化功能&#xff09;或已经完全指定但尚未永久的阶段&#xff08;…

塔子哥的快乐值-小红书2024笔试(codefun2000)

题目链接 塔子哥的快乐值-小红书2024笔试(codefun2000) 题目内容 塔子哥有许多生活琐事。已知他生活中有n个事件&#xff0c;解决第i个事件需要他花费ti的时间和hi的精力&#xff0c;并能获得ai 的快乐值。 塔子哥想知道&#xff0c;在总花费时间不超过T且总花费精力不超过H的…

操作系统如何高效处理网络请求:IO多路复用技术

在处理大量请求时&#xff0c;各个引擎都会采用线程池的方法&#xff0c;并发处理这些请求&#xff0c;但当一万个请求来的时候&#xff0c;我们要创建一万个线程来处理吗&#xff0c;很显然不会&#xff0c;那假如我创建一千个线程&#xff0c;那一线程该如何处理这个十个请求…

3GPP R18 Multi-USIM是怎么回事?(四)

前几篇主要是MUSIM feature NAS 部分内容的总结,这篇开始看RRC部分相关的内容,由于RRC部分内容过长,也分成了2篇。这篇就着重看下musim gap以及RRC触发UE离开RRC Connected mode相关的内容,直入正题, 上面的内容在overview中有提到,对应的是如下38.300中的描述。 处于网络…

Python -numpy 基础-------1

NumPy&#xff08;Numerical Python&#xff09;是Python的一个开源数值计算扩展库。它支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。NumPy的数组&#xff08;ndarray&#xff09;对象是一个快速且灵活的多维数组对象&#xff0c;用于存储…

黑龙江等保测评最新资讯:强化安全基线,赋能数字未来

在黑龙江省&#xff0c;随着数字化转型的不断深化&#xff0c;企业对其信息安全的关注也越来越高&#xff0c;而作为保护信息资产的一个重要环节的等保测评&#xff0c;也面临着新的机遇和挑战。 最新政策动向 最近&#xff0c;有关部门下发了《关于加强网络安全等级保护的指导…

基于3D开发引擎HOOPS平台的大型三维PLM系统的设计、开发与应用

产品生命周期管理&#xff08;Product Lifecycle Management&#xff0c;PLM&#xff09;系统在现代制造业中扮演着至关重要的角色。随着工业4.0和智能制造的推进&#xff0c;PLM系统从最初的CAD和PDM系统发展到现在的全面集成、协作和智能化的平台。本文将探讨基于HOOPS平台的…

【python】Numpy运行报错分析:IndexError与形状不匹配问题

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

森林防火,森林防火智能储水罐_鼎跃安全

森林防火是保护森林的重要措施&#xff0c;每年发生的森林火灾都严重威胁着自然安全&#xff0c;对社会经济和生态造成严重的破坏。为了切实有效地预防并扑灭森林火灾&#xff0c;森林防火智能储水罐已成为现代森林防火体系中的重要装备。 储水罐内置传感器和控制系统&#xff…

【CTFWP】ctfshow-web32

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;flag 题目介绍&#xff1a; <?php/* # -*- coding: utf-8 -*- # Autho…

【每日刷题Day85】

【每日刷题Day85】 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 2. 43. 字符串相乘 - 力扣&#xff08;L…

DC系列靶场---DC 2靶场的渗透测试(二)

漏洞利用及探测 rbash逃逸 虽然我们现在已经可以执行切换路径命令了&#xff0c;但是发现还有是很多命令不能用。 我想看看一下目标主机的所有用户&#xff0c;是不能执行的。 那我们就用到了当前shell逃逸。第一种情况&#xff1a;/ 被允许的情况下&#xff1b;直接 /bin/s…

SpringBoot原理解析(二)- Spring Bean的生命周期以及后处理器和回调接口

SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口 文章目录 SpringBoot原理解析&#xff08;二&#xff09;- Spring Bean的生命周期以及后处理器和回调接口1.Bean的实例化阶段1.1.Bean 实例化的基本流程1.2.Bean 实例化图例1.3.实…

go 协程池的实现

使用场景 这次需求是做一个临时的数据采集功能&#xff0c;为了将积压的数据快速的消耗完&#xff0c;但是单一的脚本消耗的太慢&#xff0c;于是乎就手写了一个简单的协程池&#xff1a; 为了能加快数据的收集速度为了稳定协程的数量&#xff0c;让脚本变得稳定 设计图如下…

微服务分布式事务

1、分布式事务是什么&#xff1f; 微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务&#xff0c;每个服务可能有自己的数据库&#xff0c;因此当一个业务操作需要跨多个服务进行时&#xff0c;确保所有服务…

sbti科学碳目标倡议是什么

在科学界、工业界以及全球政策制定者的共同努力下&#xff0c;一个名为“科学碳目标倡议”&#xff08;Science Based Targets initiative&#xff0c;简称SBTi&#xff09;的全球性合作平台应运而生。这一倡议旨在推动企业和组织设定符合气候科学要求的减排目标&#xff0c;以…

问题记录-SpringBoot 2.7.2 整合 Swagger 报错

详细报错如下 报错背景&#xff0c;我将springboot从2.3.3升级到了2.7.2&#xff0c;报了下面的错误&#xff1a; org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPo…

信息收集Part3-资产监控

Github监控 便于收集整理最新exp或poc 便于发现相关测试目标的资产 各种子域名查询 DNS,备案&#xff0c;证书 全球节点请求cdn 枚举爆破或解析子域名对应 便于发现管理员相关的注册信息 通过Server酱接口接收漏洞信息 https://sct.ftqq.com/ https://github.com/easych…

2024.7.23(DNS正向解析)

回顾&#xff1a; # 安装 samba yum -y install samba # 自建库&#xff0c;只下载&#xff0c;不安装 yum -y install --downloadonly --downloaddir./soft/ # 配置samba vim /etc/samba/smb.conf # 配置 [xxxxxxxname] commentdasdffsffdslfdjsa path/share …