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
相关产品推荐
相关产品推荐

