如何在将在 RemoteView 中使用的可绘制对象上设置颜色过滤器?

Posted

技术标签:

【中文标题】如何在将在 RemoteView 中使用的可绘制对象上设置颜色过滤器?【英文标题】:How do I set a color filter on a drawable which will be used in a RemoteView? 【发布时间】:2015-09-19 01:20:09 【问题描述】:

我在RemoteView 上有一个ImaveView,我必须为其应用过滤器。当不在RemoteView 中时,这就是我所做的并且效果很好:

    Drawable icon = getResources().getDrawable(R.drawable.icon);
    icon.setColorFilter(color, PorterDuff.Mode.SRC_IN);
    image.setImageDrawable(icon);

RemoteView 似乎没有让我设置非资源的可绘制对象的方法。我该怎么做呢?

谢谢。

【问题讨论】:

【参考方案1】:

以下代码适用于 RemoteViews,它是主屏幕小部件中的 ImageView,用于更改色调颜色。 在运行 API 级别 29 的设备上测试

remoteViews.setInt(R.id.myRemoteViewId, "setColorFilter", Color.parseColor("#000000"))

【讨论】:

【参考方案2】:

我有类似的问题。对我来说,解决方案是使用位图。这两种方法应该会给你答案,或者至少是某种解决方案。

private void setCurrentStatus(Context context, RemoteViews remoteViews) 
    Bitmap source = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
    Bitmap result = changeBitmapColor(source, Color.YELLOW);

    remoteViews.setBitmap(R.id.iv_icon, "setImageBitmap", result);


private Bitmap changeBitmapColor(Bitmap sourceBitmap, int color) 
    Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0,
            sourceBitmap.getWidth() - 1, sourceBitmap.getHeight() - 1);
    Paint p = new Paint();
    ColorFilter filter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN);
    p.setColorFilter(filter);

    Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, p);

    return resultBitmap;

R.id.iv_icon - 是布局中 ImageView 的 id

您始终可以从 ImageView 中获取可绘制对象并将其转换为位图。

【讨论】:

以上是关于如何在将在 RemoteView 中使用的可绘制对象上设置颜色过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

创建一个不透明的可绘制波纹

如何使用xml中的可绘制形状绘制半椭圆形(Android)

是否可以在 Android 的可绘制对象中使用子文件夹? [复制]

如何在android studio中的可绘制列表中显示图标

如何在按钮中创建简单的可绘制图层

如何创建从纪元时间到 matplotlib 可以使用的可绘制日期