一、继上一篇讲过设置圆形图标为默认后,发现圆形图标四周有被裁减的问题,如下图:

二、开始怀疑是launcher3中的图标设置大小出了问题,但是通过修改 launcher3中device_profiles.xml中的配置,如:

将iconSize改小,发现并不能解决问题,依然会有被剪切的情况。由此可以排除是Launcher3的问题了。

三、通过进一步跟中代码发现AdaptiveIcon的生成机制,是通过AdaptiveDrawable来解析xml文件,所以把重点放在AdaptiveDrawable上,frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java,

通过分析代码,发现里面有个方法,updateMaskBoundsInternal ,大概意思就是更新掩码区域,具体代码如下:

private void updateMaskBoundsInternal(Rect b) {

mMaskMatrix.setScale(b.width() / MASK_SIZE, b.height() / MASK_SIZE);

sMask.transform(mMaskMatrix, mMask);

if (mMaskBitmap == null || mMaskBitmap.getWidth() != b.width() ||

mMaskBitmap.getHeight() != b.height()) {

mMaskBitmap = Bitmap.createBitmap(b.width(), b.height(), Bitmap.Config.ALPHA_8);

mLayersBitmap = Bitmap.createBitmap(b.width(), b.height(), Bitmap.Config.ARGB_8888);

}

// mMaskBitmap bound [0, w] x [0, h]

mCanvas.setBitmap(mMaskBitmap);

mPaint.setShader(null);

mCanvas.drawPath(mMask, mPaint);

// mMask bound [left, top, right, bottom]

mMaskMatrix.postTranslate(b.left, b.top);

mMask.reset();

sMask.transform(mMaskMatrix, mMask);

// reset everything that depends on the view bounds

mTransparentRegion.setEmpty();

mLayersShader = null;

}

可以发现,mMaskMatrix.setScale就是对掩码进行了缩放处理,怀着试一试的心态,将其缩放比例改小,裁剪区域是减小了,但是得到的最终图标并不是圆形,猜测是mMaskMatrix.setScale没有设置中心点,于是mMaskMatrix.setScale加了一个中心点,mMaskMatrix.setScale(b.width() / MASK_SIZE,getBounds().centerX(), getBounds().centerY()),但是得到的结果也不是圆形。通过简单的修改scale发现并不能达到目的。

四、 只有从其它角度来分析了,首先,我们可以明确知道Adaptive icon的大小是用户默认都配置好了的,不能随意改变,但是裁减规则我们是可以改的,AdaptiveDrawable 中仔细分析,可以发现,adaptive icon 是由两部分组成,前景层和背景层,他们都统一依赖于Rect来裁减,具体形状是通过mask path来决定,比如说圆形,就是用的圆形mask来确定。其中Rect的大小又是根据原始drawable宽高决定的,回想之前出现的问题,感觉像是rect大了一点,drawable偏小导致四周出现了裁减不够。

终上所述,问题基本原因已经分析清楚了,目的就是取药修改rect的大小,通过分析代码,其中有个一个方法onBoundsChange,意思就是有区域发生改变就会调用该方法,这里应该就是最初调用到rect的地方,具体修改如下:

@Override

protected void onBoundsChange(Rect bounds) {

if (bounds.isEmpty()) {

return;

}

//hpe add start, adjust adaptive icon size

Log.i("hpe-icon", " bounds, width= " + bounds.width() + ", height= " + bounds.height());

if(bounds.width() > 50){// If the width is less than 50, don't handle it

int scale = Math.round(bounds.width() * 0.1f / 2);

bounds.left = bounds.left + scale;

bounds.top = bounds.top + scale;

bounds.right = bounds.right - scale;

bounds.bottom = bounds.bottom -scale;

setBounds(bounds);//to make it effective

Log.i("hpe-icon", " bounds, width= " + bounds.width() + ", height= " + bounds.height());

}

//hpe add end

updateLayerBounds(bounds);

}

编译验证,ok。

该修改大致意思就是拿到了rect,稍微缩小rect的大小,如果图标太小就不用了处理,然后重新设置一遍rect。这样就整体修改了rect,达到了目的。

android圆形图标显示不全,Android 9.0 Adaptive Icon 圆形图标剪切不全问题(上下左右部分被裁减)...相关推荐

  1. Android 9.0 Adaptive Icon 圆形图标剪切不全问题(上下左右部分被裁减)

    一.继上一篇讲过设置圆形图标为默认后,发现圆形图标四周有被裁减的问题,如下图: 二.开始怀疑是launcher3中的图标设置大小出了问题,但是通过修改 launcher3中device_profile ...

  2. Android中设置显示文本,Android文本显示控件-TextView属性详解

    android:autoLink //设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web /email/phone/map/all) andr ...

  3. Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51082574 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  4. Android应用图标微技巧,8.0系统中应用图标的适配

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/79417483 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  5. android图标未读消息,Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示...

    原理 添加角标的原理就是发送一个Broadcast(广播),在广播的Intent中指定需要被添加角标的应用的packageName(包名),className(类名),count(角标数目).当然了, ...

  6. android gridview横向显示图片,Android使用Gridview单行横向滚动显示

    本文实例为大家分享了Android使用Gridview单行横向滚动显示的具体代码,供大家参考,具体内容如下 要想实现滚动显示,layout布局里必须要使用HorizontalScrollView,才能 ...

  7. android 系统倒计时显示时间,Android 依据系统时间整点、半点倒计时

    activity_main.xml中的代码 xmlns:android="http://schemas.android.com/apk/res/android" android:l ...

  8. android8.0应用图标适配调整_Android应用图标微技巧,8.0系统中应用图标的适配

    现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了.三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米.华为.OV等国产手机厂商即将推出的 ...

  9. 服务器声卡图标显示x,简单几步解决win7声音图标显示红叉的问题

    win7旗舰版系统凭借良好的兼容性和稳定性现在还受到很多用户的欢迎,但使用久了之后难免会出现一些问题.例如就有使用win7旗舰版的用户反映说自己的电脑出现了声音图标显示红叉不能使用的情况,其实可能是因 ...

最新文章

  1. php前端传过来的json数据丢失 (max_input_vars)
  2. hdu 1723 DP/递推
  3. linux启动脚本 范本,Linux—微服务启停shell脚本编写模板
  4. zabbix3.4搭建钉钉报警
  5. Android解决button反复点击问题
  6. centos 升级mysql_CentOS 7下升级MySQL5.7.23的一个坑
  7. 编码练习——Java-3-数组
  8. bzoj 3343: 教主的魔法
  9. vue (可读写)全局变量的 定义、任意调用、值的修改
  10. oracle基础与应用
  11. kmeans算法中的sse_《Kmeans的K值确定》
  12. node打印彩色文字
  13. Mybatis(狂神老师上课笔记)
  14. 云数据时代的协作办公,超级表格强力出击!
  15. #大话设计模式之适配器模式#
  16. kali下载速度慢_kali Linux 2020.1最新安装教程,绝对能帮你安装好!不是root、没有桌面、中文乱码、下载太慢、ssh链接等问题!...
  17. PTA L2-003 月饼
  18. 2016 年 50 个最佳的轻量级 JavaScript 框架和库一
  19. 流程引擎规则引擎_规则引擎的优势
  20. HAUT 1262 魔法宝石(spfa)(河南工业大学2017校赛)

热门文章

  1. three.js webgl_tiled_forward 例子分析
  2. 一级计算机证科目,有关一级计算机考试内容
  3. 高中计算机教师研究方向,高中信息技术教师工作计划
  4. 查看MySQL初始密码、解决MySQL5.7修改密码以及密码认证失败(Your password does not satisfy the current policy requirements)
  5. 大数据趣味学习探讨(一):学习框架的重要性
  6. CSDN周赛第36期:赢热门实体图书《算法竞赛》和定制周边
  7. 【即将截止】#榜样的力量#寻找新冠战“疫”,中国数据智能产业先锋力量丨数据猿公益策划...
  8. python bitmap_Python win32ui.CreateBitmap方法代码示例
  9. smbException:The process cannot access the file because it is being used by another process的错误原因
  10. 使用css实现一个圆形头像框效果