Jetpack Compose中获取应用图标显示异常:仅呈现实心圆无图标
问题原因及解决办法
核心原因
Tint 覆盖了图标原有层次
你设置的tint = MaterialTheme.colorScheme.secondary会对整个图标Drawable进行染色。现在大部分应用用的是Android自适应图标(AdaptiveIconDrawable),这种图标分为前景(实际应用标志)和背景(通常是纯色/渐变圆)两层。如果前景图标是单色(比如白色),tint会把前景和背景都改成secondary颜色,两者融合后就只剩一个实心圆了。自适应图标转Bitmap的处理问题
直接调用drawable.toBitmap()时,系统会把自适应图标的前景和背景合并成一个Bitmap,再加上tint的作用,就会让原本的前景标志被背景颜色覆盖,看起来像实心圆。
解决办法
办法一:移除Tint属性
如果不需要统一染色,直接删掉tint参数,图标就能显示原本的样式:
val drawable = packageManager.getApplicationIcon(app.packageName) Icon( drawable.toBitmap(config = Bitmap.Config.ARGB_8888).asImageBitmap(), contentDescription = "Icon", modifier = Modifier.padding(8.dp) )
办法二:仅对自适应图标的前景层染色
如果需要保留tint效果,先判断Drawable类型,单独提取前景层再处理:
val drawable = packageManager.getApplicationIcon(app.packageName) val iconBitmap = when (drawable) { is AdaptiveIconDrawable -> { drawable.foreground.toBitmap(config = Bitmap.Config.ARGB_8888).asImageBitmap() } else -> { drawable.toBitmap(config = Bitmap.Config.ARGB_8888).asImageBitmap() } } Icon( iconBitmap, contentDescription = "Icon", modifier = Modifier.padding(8.dp), tint = MaterialTheme.colorScheme.secondary )
办法三:获取指定尺寸的图标
有时候系统返回的默认图标尺寸过小,也会导致显示异常,可以尝试获取应用的原始图标资源:
val appInfo = packageManager.getApplicationInfo(app.packageName, PackageManager.GET_META_DATA) val drawable = packageManager.getDrawable(app.packageName, appInfo.icon, appInfo) Icon( drawable.toBitmap(config = Bitmap.Config.ARGB_8888).asImageBitmap(), contentDescription = "Icon", modifier = Modifier.padding(8.dp), tint = MaterialTheme.colorScheme.secondary )
内容的提问来源于stack exchange,提问作者Mehdi Haghgoo
相关产品推荐
相关产品推荐

