You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中setColorFilter(int,Mode)废弃后Java实现方案咨询

Android中废弃的setColorFilter(int color, PorterDuff.Mode) Java替代实现

原方法public void setColorFilter(int color, PorterDuff.Mode mode)在API 29被废弃,官方推荐使用setColorFilter(ColorFilter)结合BlendModeColorFilter实例替代。以下是Java版本的具体实现:

基础实现(API 29+)

直接使用BlendModeColorFilter,将原有PorterDuff.Mode转换为对应BlendMode即可:

// 示例:设置红色叠加效果
int targetColor = Color.RED;
// 对应原PorterDuff.Mode.SRC_IN的BlendMode
BlendMode blendMode = BlendMode.SRC_IN;
ColorFilter colorFilter = new BlendModeColorFilter(targetColor, blendMode);

// 给View背景设置滤镜
yourView.getBackground().setColorFilter(colorFilter);
// 或给ImageView的Drawable设置滤镜
yourImageView.getDrawable().setColorFilter(colorFilter);

兼容低版本(API <29)

如果需要适配API 29以下设备,可通过版本判断保留旧方法:

int targetColor = Color.RED;
PorterDuff.Mode porterDuffMode = PorterDuff.Mode.SRC_IN;
Drawable drawable = yourView.getBackground();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    BlendMode blendMode = convertPorterDuffModeToBlendMode(porterDuffMode);
    drawable.setColorFilter(new BlendModeColorFilter(targetColor, blendMode));
} else {
    // 继续使用废弃方法兼容低版本
    drawable.setColorFilter(targetColor, porterDuffMode);
}

// 封装PorterDuff.Mode到BlendMode的转换方法
@RequiresApi(api = Build.VERSION_CODES.Q)
private static BlendMode convertPorterDuffModeToBlendMode(PorterDuff.Mode mode) {
    switch (mode) {
        case CLEAR: return BlendMode.CLEAR;
        case SRC: return BlendMode.SRC;
        case DST: return BlendMode.DST;
        case SRC_OVER: return BlendMode.SRC_OVER;
        case DST_OVER: return BlendMode.DST_OVER;
        case SRC_IN: return BlendMode.SRC_IN;
        case DST_IN: return BlendMode.DST_IN;
        case SRC_OUT: return BlendMode.SRC_OUT;
        case DST_OUT: return BlendMode.DST_OUT;
        case SRC_ATOP: return BlendMode.SRC_ATOP;
        case DST_ATOP: return BlendMode.DST_ATOP;
        case XOR: return BlendMode.XOR;
        case DARKEN: return BlendMode.DARKEN;
        case LIGHTEN: return BlendMode.LIGHTEN;
        case MULTIPLY: return BlendMode.MULTIPLY;
        case SCREEN: return BlendMode.SCREEN;
        case ADD: return BlendMode.PLUS; // 注意PorterDuff.ADD对应BlendMode.PLUS
        case OVERLAY: return BlendMode.OVERLAY;
        default: return BlendMode.SRC_OVER;
    }
}

注意:BlendMode与PorterDuff.Mode并非完全一一映射,比如PorterDuff.Mode.ADD需要对应BlendMode.PLUS,转换时需注意该映射关系。

内容的提问来源于stack exchange,提问作者Lechius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:35:23