Android中Java替代已弃用setColorFilter(int,Mode)方法的问询
Android API 29弃用
setColorFilter(int, PorterDuff.Mode)的Java替代方案 API 29及以上版本中,View.getBackground().setColorFilter(int color, PorterDuff.Mode mode)方法已被弃用,官方要求改用setColorFilter(ColorFilter)结合BlendModeColorFilter实现相同效果。以下是Java环境下的适配方案,包含原生API与兼容低版本的两种写法:
原弃用代码
public static void setcol(TextView dLabel) { dLabel.getBackground().setColorFilter(color, android.graphics.PorterDuff.Mode.MULTIPLY); }
替代方案
1. 仅适配API 29+(原生实现)
直接使用BlendModeColorFilter,对应原代码的MULTIPLY模式,需注意BlendMode.MULTIPLY在API 29才引入:
import android.os.Build; import android.graphics.BlendMode; import android.graphics.BlendModeColorFilter; import android.graphics.PorterDuff; public static void setcol(TextView dLabel) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { dLabel.getBackground().setColorFilter( new BlendModeColorFilter(color, BlendMode.MULTIPLY) ); } else { // 低版本保留原弃用方法做兼容 dLabel.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY); } }
2. 兼容全版本(使用AndroidX Compat类)
通过BlendModeColorFilterCompat实现跨版本兼容,无需手动判断API等级,推荐在AndroidX项目中使用:
import androidx.core.graphics.BlendModeColorFilterCompat; import androidx.core.graphics.BlendModeCompat; public static void setcol(TextView dLabel) { dLabel.getBackground().setColorFilter( BlendModeColorFilterCompat.createBlendModeColorFilterCompat( color, BlendModeCompat.MULTIPLY // 对应原代码的MULTIPLY模式,注意不要用SRC_OVER ) ); }
关键注意点
你之前尝试的代码中误用了BlendModeCompat.SRC_OVER,这和原代码的MULTIPLY模式视觉效果完全不同,必须替换为BlendModeCompat.MULTIPLY才能匹配原有逻辑。
内容的提问来源于stack exchange,提问作者Lechius
相关产品推荐
相关产品推荐

