android - 将多个滤色器应用于同一个可绘制对象

标签 android chaining android-drawable colorfilter

我想将多个滤色器串联应用到可绘制对象。那可能吗?或者创建一个过滤器,它是我要应用的过滤器的组合。

例如,我想:

Drawable d = ...;
d.setColorFilter(0x3F000000, Mode.OVERLAY).setColorFilter(0xFF2D2D2D, Mode.SCREEN)

最佳答案

这是我最后使用的方法:在 Canvas 上操作 Drawable 位图并使用 Paint 应用我需要的图层,它不仅适用于滤色器,还适用于任何类型的图像混合。

...
Drawable myBackground = createBackground(getResources().getColor(R.color.Green)); 
setBackgroundDrawable(myBackground);
...

private Drawable createBackground(int color) {

    Canvas canvas = new Canvas();
    Bitmap buttonImage = BitmapFactory.decodeResource(getResources(), R.drawable.btn_image);
    Bitmap buttonShadows = BitmapFactory.decodeResource(getResources(), R.drawable.btn_shadows);
    Bitmap buttonHighLights = BitmapFactory.decodeResource(getResources(), R.drawable.btn_highlights);
    Bitmap result = Bitmap.createBitmap(buttonImage.getWidth(), buttonImage.getHeight(), Bitmap.Config.ARGB_8888);

    canvas.setBitmap(result);
    Paint paint = new Paint();
    paint.setFilterBitmap(false);

    // Color
    paint.setColorFilter(new PorterDuffColorFilter(color, Mode.MULTIPLY));
    canvas.drawBitmap(buttonImage, 0, 0, paint);
    paint.setColorFilter(null);
    // Shadows
    paint.setXfermode(new PorterDuffXfermode(Mode.MULTIPLY));
    canvas.drawBitmap(buttonShadows, 0, 0, paint);
    // HighLights
    paint.setXfermode(new PorterDuffXfermode(Mode.SCREEN));
    canvas.drawBitmap(buttonHighLights, 0, 0, paint);

    paint.setXfermode(null);
    return new BitmapDrawable(getResources(), result);
}

警告:setBackgroundDrawable(Drawable d) 已弃用,而 setBackground(Drawable d) 仅从 api 16 开始可用,因此如果你有像我一样的最小目标 api-14 最大目标 api-17 你没有“干净”的方式将可绘制对象设置为背景。我坚持使用已弃用的调用。

关于android - 将多个滤色器应用于同一个可绘制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346545/

相关文章:

Android:以编程方式检测设备是否连接了硬件触摸屏

android - 将 SharedPreferences 用作磁盘缓存是一种好习惯吗?

javascript - 使用 jQuery 的动态 AJAX promise 链

python-2.7 - 如何在Python中使用reactor链接函数?

php - 链接 PHP PDO 查询

安卓延迟文本

android - 如何使用 'RotateDrawable'?

自 Android Studio 4.1 起,Android Background Drawable 在按钮中不起作用

android - 如何在不缩放的情况下将可绘制的矢量在图层列表中居中

java - Room Android 实体和 POJO 必须具有可用的公共(public)构造函数