Android Wear complication着色问题:如何禁用Google Assistant complication着色
我之前开发Wear表盘时也碰到过一模一样的问题——Google Assistant的Complication不管怎么调颜色设置,总是被强制着色,完全看不到它的原始图标。后来摸索出几个有效的解决方法,你可以试试:
方法1:直接禁用ComplicationDrawable的图标着色
setIconColorActive()这个方法只是设置着色的颜色,而不是关闭着色功能,所以你注释掉它之后,系统会用默认的白色来着色。要彻底禁用着色,你需要调用ComplicationDrawable的专门开关:
private void setComplicationsActiveAndAmbientColors(int primaryComplicationColor) { int complicationId; ComplicationDrawable complicationDrawable; for (int i = 0; i < COMPLICATION_IDS.length; i++) { complicationId = COMPLICATION_IDS[i]; complicationDrawable = mComplicationDrawableSparseArray.get(complicationId); if (complicationId == BACKGROUND_COMPLICATION_ID) { complicationDrawable.setBackgroundColorActive(Color.BLACK); } else { // Active mode colors. complicationDrawable.setBorderColorActive(primaryComplicationColor); complicationDrawable.setRangedValuePrimaryColorActive(primaryComplicationColor); // 关键:禁用图标着色,让Complication显示原始图标 complicationDrawable.setIconTintEnabled(false); // Ambient mode colors. complicationDrawable.setBorderColorAmbient(Color.WHITE); complicationDrawable.setRangedValuePrimaryColorAmbient(Color.WHITE); } } }
这行setIconTintEnabled(false)会直接关闭图标的颜色滤镜,让Google Assistant的图标显示它原本的样子。
方法2:检查XML配置中的着色属性
如果你的ComplicationDrawable是从XML资源文件加载的,记得检查文件里有没有设置app:iconTint、app:iconColorActive这类属性,把它们删除或者设置为@null,避免XML层面的默认着色覆盖你的代码设置。
方法3:针对Google Assistant单独处理
如果上面的方法还没生效,你可以通过Complication的提供商信息,单独对Google Assistant的Complication做处理:
// 获取Complication的提供商信息 ComplicationInfo info = getComplicationManager().getComplicationInfo(complicationId); if (info != null) { ComponentName provider = info.getProvider(); // 判断是否是Google Assistant的Complication if ("com.google.android.googlequicksearchbox".equals(provider.getPackageName())) { complicationDrawable.setIconTintEnabled(false); // 额外清除可能存在的颜色滤镜 complicationDrawable.setColorFilter(null); } }
这样可以确保只有Google Assistant的Complication禁用着色,不影响其他Complication的正常颜色设置。
原理其实很简单:Wear系统默认会给Complication图标加上着色滤镜,setIconTintEnabled(false)就是关闭这个滤镜的开关,而你之前用的setIconColorActive()只是修改滤镜的颜色,并没有关掉滤镜本身。
内容的提问来源于stack exchange,提问作者Tykin

