/vendor/mediatek/proprietary/packages/apps/Launcher3/ src/com/android/launcher3/icons/IconCache.java

Q版本:,S版本的就setAppIconTheme方法里两句换成注释的,主要是entry.bitmap,entry没有这个bitmap属性会报错。

以下方法,s应该也适用,

Q版本的launcher3目录下

iconloaderlib/src/com/android/launcher3/icons/cache/BaseIconCache.java:72:里面定义了这个CacheEntry类,继承了BitmapInfo

./iconloaderlib/src/com/android/launcher3/icons/BitmapInfo.java

这里面q就只定义了icon

    publicBitmap icon;public int color;

S上是quickstep/src/com/android/quickstep/TaskIconCache.java的TaskCacheEntry类

导包

    importandroid.content.ComponentName;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.text.TextUtils;importcom.android.launcher3.R;importandroid.graphics.drawable.BitmapDrawable; 

这个是在Q版本放在这里使用,因为如果在setAppIconTheme方法里面加的话会出现切换系统语言后有些图标不更新的bug,但高版本没有这个bug.还有getIconFactory().createScaledBitmapWithoutShadow(d,true);之所以用到这个方法是让所有应用图标大小一致,不用的话,客制替换的图标太大了。不过这样子改完图标都变成很小了且有四周白边,再把图标撑满画布就行,不过这个时候比例不对,看起来很方不够圆润好看,需要修改比例,然后如果还嫌图标太小去src/com/android/launcher3/DeviceProfile.java。把图标大小调大点就可以。

在protectedvoid applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) {

方法中加入

    String[]arr = mContext.getResources().getStringArray(R.array.icon_package);for (int i = 0; i < arr.length; i++){if(getIconPackage(i).contains(info.getTargetComponent().getPackageName())){Log.d("yantao","packageName("+ i+")="+getIconPackage(i));Bitmap bitmap =BitmapFactory.decodeResource(mContext.getResources(),getIconId(i));bitmap.setHasAlpha(true);Drawabled = new FixedSizeBitmapDrawable(bitmap);entry.icon =getIconFactory().createScaledBitmapWithoutShadow(d,true);//entry.icon = bitmap;}}

实际上就是下面的setAppIconTheme方法,只不过不需要那么多参数,灵活变通,这个方法高版本,如S版本可以,放在

    privatesynchronized void getTitleAndIcon(@NonNull ItemInfoWithIconinfoInOut,@NonNullSupplier<LauncherActivityInfo> activityInfoProvider,boolean usePkgIcon, booleanuseLowResIcon) {applyCacheEntry(entry,infoInOut);之前加入setAppIconTheme(infoInOut.getTargetComponent(),activityInfoProvider,activityInfoProvider.get(),entry);

然后是用到的方法

    privatevoid setAppIconTheme(ComponentName componentName,Supplier<LauncherActivityInfo> infoProvider,LauncherActivityInfo info,CacheEntryentry){String[] arr =mContext.getResources().getStringArray(R.array.icon_package);for (int i = 0; i < arr.length; i++){if(getIconPackage(i).contains(componentName.getPackageName())){Log.d("song","packageName("+ i+")="+getIconPackage(i));Bitmap bitmap =BitmapFactory.decodeResource(mContext.getResources(),getIconId(i));bitmap.setHasAlpha(true);Drawable d= new FixedSizeBitmapDrawable(bitmap);entry.bitmap= getIconFactory().createBadgedIconBitmap(d,info.getUser(),true);return;}}

//entry.bitmap =getIconFactory().createBadgedIconBitmap(getFullResIcon(info),info.getUser(),true); //这句话不需要

    publicString getIconPackage(int i){String[] arr =mContext.getResources().getStringArray(R.array.icon_package);return arr[i];}public int getIconId(int i){String[] imageNameArr =mContext.getResources().getStringArray(R.array.icon_image);String imageName = null;if(!TextUtils.isEmpty(imageNameArr[i])){imageName =imageNameArr[i].substring(0, imageNameArr[i].indexOf("."));}int resId =mContext.getResources().getIdentifier(imageName, "drawable" ,mContext.getPackageName());return resId;}s上没有entry.icon的属性privatestatic class FixedSizeBitmapDrawable extends BitmapDrawable {public FixedSizeBitmapDrawable(Bitmapbitmap) {super(null, bitmap);}@Overridepublic int getIntrinsicHeight() {return getBitmap().getWidth();}@Overridepublic int getIntrinsicWidth() {return getBitmap().getWidth();}}

其实就是遍历数组获得对应的图片包名,把传进来对应的entry的图标换成由bitmap存放的客制图片,所以S上应该也可以直接替换不需要再FixedSizeBitmapDrawable

然后需要做一个array资源数组把包名和图片一一对应

./vendor/mediatek/proprietary/packages/apps/Launcher3/quickstep/res/values/config.xml

    <?xmlversion="1.0" encoding="utf-8"?><resources><string-arrayname="icon_package" translatable="false"><item>com.android.settings</item><item>com.android.dialer</item></string-array><string-arrayname="icon_image" translatable="false"><item>ic_launcher_setting.png</item><item>ic_launcher_dialer.png</item></string-array></resources>

然后放置资源图片

./vendor/mediatek/proprietary/packages/apps/Launcher3/quickstep/res/drawable/ ic_launcher_setting.png

注意这里之所以都放在quickstep,,是因为此项目带GMS,编译出的apk叫MtkLauncher3GoIconRecents,看mk文件生效的是quickstep里的资源,其他正常项目的话放在外面的res就可以,当然也可以放在特定密度,比如drawable-hdpi/

部分相关知识:

每次系统语言更新后接到广播就可以刷新图标,变成相应的语言

vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java

    if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {//If we have changed locale we need to clear out the labels in all apps/workspace.forceReload();

为啥要放在这个applyCacheEntry方法里:

Q版本为例:

里面有很多getTitleAndIcon方法,其中只有三个走到

其中public synchronized voidgetTitleAndIcon(ItemInfoWithIcon info,

LauncherActivityInfo activityInfo,boolean useLowResIcon) {

//这个标为1

第一个走到,然后传到下面这个必走

//这个标为3,这个方法是必走的

    privatesynchronized void getTitleAndIcon(@NonNull ItemInfoWithIconinfoInOut,@NonNullSupplier<LauncherActivityInfo> activityInfoProvider,boolean usePkgIcon, booleanuseLowResIcon) {CacheEntry entry =cacheLocked(infoInOut.getTargetComponent(), infoInOut.user,activityInfoProvider,mLauncherActivityInfoCachingLogic, usePkgIcon, useLowResIcon);applyCacheEntry(entry, infoInOut);}

但是如果换了系统语言,再回到桌面,上面两个刚开始也会走,后面就是这个2来传给3

//这个标为2

publicsynchronized void getTitleAndIcon(ItemInfoWithIcon info, boolean useLowResIcon){

所以如果在3里更换icon,后面2传进来再跟新会有部分icon又回到默认的,关键是在于applyCacheEntry,所以只需要在这个方法每次都换掉icon就行

应用图标去掉四周白边:

这是加了GMS的走这个,实际看情况编的是vendor下的还是package下的

packages/apps/Launcher3/iconloaderlib/src/com/android/launcher3/icons/FixedScaleDrawable.java

源码

private staticfinal float LEGACY_ICON_SCALE = .7f * .6667f;

换成

private static finalfloat LEGACY_ICON_SCALE = 1.0f;

这个实际作用就是把图标中心往外撑大,1.0就是撑满画布。该属性控制图标缩放大小。源码把这个属性赋值

publicFixedScaleDrawable() {super(new ColorDrawable());mScaleX = LEGACY_ICON_SCALE;mScaleY = LEGACY_ICON_SCALE;}

然后保持原有比例:(在此之前会出现图标看上去很方正,不美观)

packages/apps/Launcher3/ iconloaderlib/src/com/android/launcher3/icons/BaseIconFactory.java

private Drawable normalizeAndWrapToAdaptiveIcon(方法中

源码那套算法不要了

    if (shrinkNonAdaptiveIcons && ATLEAST_OREO){if(mWrapperIcon == null) {mWrapperIcon =mContext.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate();}AdaptiveIconDrawable dr = (AdaptiveIconDrawable) mWrapperIcon;dr.setBounds(0, 0, 1, 1);boolean[] outShape = new boolean[1];scale = getNormalizer().getScale(icon, outIconBounds, dr.getIconMask(),outShape);if(!(icon instanceof AdaptiveIconDrawable) && !outShape[0]) {FixedScaleDrawable fsd = ((FixedScaleDrawable) dr.getForeground());fsd.setDrawable(icon);fsd.setScale(scale);icon = dr;scale = getNormalizer().getScale(icon, outIconBounds, null, null);((ColorDrawable) dr.getBackground()).setColor(mWrapperBackgroundColor);}} else{scale = getNormalizer().getScale(icon, outIconBounds, null, null);}

全都注释掉

就用一句else里的加上就可以

scale =getNormalizer().getScale(icon, outIconBounds, null, null);

桌面图标icon替换客制图标。图标要比原始图标大,要求一致。应用图标去掉四周白边,保持原有比例。相关推荐

  1. Android自定义app图标,自定义app图标(Icon) - Cordova中文网

    自定义图标(Icon) 这节将介绍如何为不同的平台配置一个app的图标.对启动画面(splash screen)的支持已经被移动到Cordova自己的插件中了.配置选项可以在Splashscreen插 ...

  2. 阿里图标icon二次引入+ 图标引入后是黑色解决办法。

    阿里图标icon二次引入 第一到第三步. 第四步 找到文件夹复制代码 阿里图标icon二次引入 , 引入后你就会发现 是黑色 没有原来图标的颜色 就像这种 如何让本来的颜色出来呢 ? 1.找到项目设置 ...

  3. 免费素材大荟萃:免费图标和UI设计

    日期:2013-2-1  来源:GBin1.com 还记得我们发布过的许多免费的图标和素材吧!今天我们精心挑选了最新的一套免费资源,包括了免费图标,图标字体,还有来自dribbble的相关的UI界面设 ...

  4. el-table 树形表格 自定义展开图标_换图标icon APP下载-换图标icon APP官方版 v3.01.0927...

    换图标icon APP是一款可以带来更多不同风格应用图标和壁纸资源给大家尝试的软件,轻松打造个性化的桌面,资源类型丰富,直接在线去搜索查找就可以了,全部免费下载即可体验,重点是设置方便,壁纸等图片的尺 ...

  5. R语言编写自定义函数、创建使用ggplot2生成图标(icon)的主题(theme)函数、使用ggplot2以及自定义的图标主题函数创建箱图(boxplot)图标、ggsave保存图标(png、svg

    R语言编写自定义函数.创建使用ggplot2生成图标(icon)的主题(theme)函数.使用ggplot2以及自定义的图标主题函数创建箱图(boxplot)图标.ggsave保存图标(png.svg ...

  6. jQuery Mobile中图标icon样式大全ui-icon-*

    全栈工程师开发手册 (作者:栾鹏) jQuery Mobile 所有class选项 jQuery Mobile中图标icon样式大全 //ui-icon-action 动作 (一般用于页面跳转切换) ...

  7. 使用C#从图片文件生成图标ICON文件(附源文件)

    使用C#从图片文件生成图标ICON文件(附源文件) 看到网上有一些网站做图标转换工具,挺好的,所以研究了一下在C#中是如何实现的.其实很简单几行代码就可以搞定. 主要是使用System.Drawing ...

  8. Android Studio 更换/设置App应用图标Icon

    Android Studio 更换/设置App应用图标Icon 刚开始接触Android Studio,用C++.Java编程做一个小的App,心血来潮想要换掉默认的安卓应用图标和应用名称,在经历一番 ...

  9. linux修改文件图标,Gnome怎么修改应用图标icon

    icon元素包括两个可选的子元素:small-icon子元素和large-icon子元素.文件名是Web应用归档文件(WAR)的根的相对路径.部署描述符并没有使用icon元素.下面跟着学习啦小编一起来 ...

最新文章

  1. C#中关键字ref与out的区别(转)
  2. java编程好文章链接收集
  3. DB2中admin_cmd执行load
  4. (原创)我也玩万能表单(自定义表单)(一)
  5. Bailian2689 大小写字母互换【文本】(POJ NOI0107-14)
  6. sap事务代码_SAP成本模块常用事务代码清单
  7. android霓虹灯源代码——基础编
  8. VMware安装linux镜像
  9. python pyaudo播放wav声音文件
  10. 兄弟打印机内存已满清零方法_brother打印机怎么清零?brother打印机清零方法
  11. Hybird开发之webview
  12. 央行发布2020年规章制定计划 涉及个人金融信息保护、征信业务
  13. 计算机相关专业学历重要么?
  14. Android使用Intent一键分享图片文字到腾讯、新浪、开心、微信等
  15. 上海电气“星云智汇”工业互联网平台
  16. Qt5:输入控件 QPushButton/ QToolButton/ QRadioButton/ QCheckBox/ QTextEdit/ QComboBox/ QSpinBox/ QLabel
  17. 哈夫曼树(模拟+哈夫曼树+最小WPL)
  18. 真正可用的使用T5577卡复制4100卡_ID卡复制
  19. nfs挂载和取消挂载命令
  20. 《现代命令行工具指南》10. 管理工具:在隔离环境中安装和运行 Python 命令行工具 - Pipx

热门文章

  1. 联想扬天 V14 、V15 锐龙版 2023款 评测
  2. Java -- 乒乓球 乒乓弹球游戏
  3. win10html服务器搭建,windows10 系统配置nginx文件服务器的图文教程
  4. 【数据结构与算法】期末复习刷题日寄Part02
  5. dreamweaver cs4 css汉化补丁,dreamweaver cs4官方版
  6. python之 logging模块详细使用【转载】
  7. 后端优化 | VINS-Mono 论文公式推导与代码解析分讲
  8. ng alain的简单使用
  9. 网站变成灰色(置灰)
  10. maya建模与骨骼动画快速实现人工鱼