Android中MULTIPLY模式API兼容问题及解决方案咨询
我之前使用过时的public void setColorFilter (int color, PorterDuff.Mode mode)方法为TextView设置背景颜色滤镜,其中PorterDuff.Mode.MULTIPLY无API级别限制警告。替换为非过时的BlendModeColorFilterCompat.createBlendModeColorFilterCompat方法后,BlendModeCompat.MULTIPLY要求API级别29,但当前项目最低适配API为21,出现级别不兼容警告。我不想替换为相似模式(无法保证效果一致),自行编写了版本判断的兼容代码,现咨询该方案是否可行,以及有无更优解决办法。
原过时方法实现
public static void setcol(TextView dLabel) { dLabel.getBackground().setColorFilter(color, android.graphics.PorterDuff.Mode.MULTIPLY); }
替换后的非过时方法(存在API警告)
public static void setcol(TextView dLabel) { dLabel.getBackground().setColorFilter( BlendModeColorFilterCompat.createBlendModeColorFilterCompat( color, BlendModeCompat.MULTIPLY ) ); }
自行编写的兼容代码
@SuppressWarnings("deprecation") public static void setcol(TextView dLabel) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { dLabel.getBackground().setColorFilter( color, android.graphics.PorterDuff.Mode.MULTIPLY ); } else { dLabel.getBackground().setColorFilter( BlendModeColorFilterCompat.createBlendModeColorFilterCompat( color, BlendModeCompat.MULTIPLY ) ); } }
方案可行性与优化建议
1. 你的方案完全可行
这种版本分支的写法是Android兼容开发的标准实践:在API 29及以下版本继续使用旧的过时方法(它在低版本系统中依然能正常工作,只是被标记为过时),API 29及以上版本使用新的兼容方法。@SuppressWarnings("deprecation")的使用也合理,明确告知编译器你是有意使用过时API做兼容处理。
2. 更优简化方案
BlendModeColorFilterCompat本身是AndroidX提供的兼容类,内部已经封装了版本判断逻辑,你无需手动编写分支:
public static void setcol(TextView dLabel) { dLabel.getBackground().setColorFilter( BlendModeColorFilterCompat.createBlendModeColorFilterCompat( color, BlendModeCompat.MULTIPLY ) ); }
该方法在API 29以下会自动退化为使用PorterDuff.Mode实现相同的混合效果,既能保证视觉一致性,又能让代码更简洁。
你之前遇到的API警告,是因为BlendModeCompat.MULTIPLY在低版本通过兼容层实现,只要引入了正确的AndroidX依赖(androidx.core:core或androidx.core:core-ktx),可以通过添加@RequiresApi(api = Build.VERSION_CODES.Q)注解,或在IDE中配置忽略该警告来消除提示,实际运行不会有兼容性问题。
内容的提问来源于stack exchange,提问作者Lechius

