- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 setColorFilter
为图形着色。以下代码似乎在 Lollipop 上运行良好,但似乎对 kitkat 没有影响,图标以其原始颜色呈现:
Drawable icon = ContextCompat.getDrawable(context, R.drawable.ic_chat_button).mutate();
icon.setColorFilter(context.getResources().getColor(R.color.control_tint_color), PorterDuff.Mode.SRC_ATOP);
icon.invalidateSelf();
mutate
和 invalidateSelf
调用似乎对这里的问题没有任何影响,只是将它们作为已尝试解决的部分示例了解发生了什么。
FWIW,我将 drawable 用作 StateListDrawable
中 LayerDrawable
的一部分,它被用作按钮的背景或 的 drawable code>ImageView
无论哪种方式,结果都是一致的(即,在 kitkat 上是错误的)。我还尝试再次将可绘制图标直接放入 StateListDrawable
中,但行为没有任何变化。在所有情况下,它都适用于 Lollipop ,但不适用于 kitkat。
作为实验,我从 StateListDrawable
而不是 LayerDrawable
中取出了着色的 Drawable
并且它按预期工作。显然,KitKat 对 StateListDrawable
的实现存在某些缺陷,导致其无法正常工作,但已在更高版本中修复。
最佳答案
最终,问题似乎是 KitKat 不支持在 Drawable
上使用 ColorFilter
(或隐含的 alpha),后者又将位于StateListDrawable
。我的解决方案是使用相同的代码来构建复杂的 Drawable
,然后将其呈现为简单的 BitMapDrawable
:
static Drawable createDrawable(Context context, int color, boolean disabled) {
OvalShape oShape = new OvalShape();
ShapeDrawable background = new ShapeDrawable(oShape);
background.getPaint().setColor(color);
ShapeDrawable shader = new ShapeDrawable(oShape);
shader.setShaderFactory(new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
return new LinearGradient(0, 0, 0, height,
new int[]{
Color.WHITE,
Color.GRAY,
Color.DKGRAY,
Color.BLACK
}, null, Shader.TileMode.REPEAT);
}
});
Drawable icon = ContextCompat.getDrawable(context, R.drawable.ic_chat_button).mutate();
icon.setColorFilter(context.getResources().getColor(R.color.control_tint_color), PorterDuff.Mode.SRC_IN);
Drawable layer = new LayerDrawable(new Drawable[]{ shader, background, icon });
layer.setAlpha(disabled ? 128 : 255);
// Note that on KitKat, setting a ColorFilter on a Drawable contained in a StateListDrawable
// apparently doesn't work, although it does on later versions, so we have to render the colored
// bitmap into a BitmapDrawable and then put that into the StateListDrawable
Bitmap bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(), icon.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
layer.setBounds(0, 0, layer.getIntrinsicWidth(), layer.getIntrinsicHeight());
layer.draw(canvas);
return new BitmapDrawable(context.getResources(), bitmap);
}
关于android - setColorFilter 似乎不适用于 kitkat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31663382/
如果我点击“Collection 夹”,心就会变成红色这是代码: holder.preferiti.setOnClickListener(new View.OnClickListener() {
我创建了一个名为btn.xml 的布局资源文件,它包含ImageView。在主要 Activity 中,我在 content_main.xml 中膨胀 btn.xml,并尝试设置膨胀 View 的背景
我的应用程序布局中有几个按钮,我想动态更改这些按钮的颜色。当我使用 b.setBackgroundColor(0xFF386F00); 颜色按预期变化,但按钮的形状、大小和填充也发生变化,如 this
我有一个扩展按钮 View 的类,我用它来创建自定义形状的按钮,例如十六进制按钮,并且仅响应实际按钮区域的点击,而不响应 View 的默认矩形形状。然而,这部分工作正常,我还希望能够更改按钮的颜色,而
这段代码有什么问题?我一直在努力获得 dwb2 ColorFiltered 几个小时,当按下这个按钮时它只显示原始资源:( public ButtonEx(Context context, Attri
如果我像这样使用 setColorFilter,它会起作用并用所选颜色绘制我的图像: int color = Color.parseColor("#FF0000"); viewHolder.Icon.
此代码使用位图的 alpha channel 绘制单一颜色(带 alpha)形状。 Bitmap alphaMask = bitmap.extractAlpha(); Paint paint = ne
我需要使用我的应用中的 HTML 颜色代码。 我正在使用: ProgressBar downloadProgressBar = (ProgressBar) findViewById(R.id.down
我正在尝试在 ImageView 上实现一个简单的颜色过滤器,以将黑色图像变成白色图像。为了实现这一点,我做了以下事情: weatherImg.setColorFilter(Color.BLA
编译器告诉我 setColorFilter 已被弃用! tab?.icon?.setColorFilter( ContextCompat.getColor(requi
为什么下面的代码没有对源位图mBitmap做任何改变? mBitmap 是一个灰度图像,我想对其应用滤色器。过滤器本身并不重要,但我对其应用的任何颜色过滤器都没有效果。绘制到屏幕上的是原始位图,就好像
我正在尝试使用 setColorFilter 为图形着色。以下代码似乎在 Lollipop 上运行良好,但似乎对 kitkat 没有影响,图标以其原始颜色呈现: Drawable icon = Con
我一直在寻找回答这个问题的帖子,但没有一个对我有用,所以我认为我对它应该如何工作存在根本性的误解。我有一个 ImageButton,它应用了一个 png 文件。除了白色箭头外,png 大部分是透明的。
我有一段代码可以在点击时改变图像按钮的色调。 这是java代码 button.setOnTouchListener(new OnTouchListener() { public bo
(我稍微改变了问题,因为现在问题更清楚了) 我的应用程序上有 4 个按钮,当用户单击某个按钮时我更改了该按钮的颜色。 单击按钮 3 时,我想将他的颜色更改为绿色,否则我想删除他的绿色滤镜(单击按钮 1
我在使用 imageView.setColorFilter() 时遇到问题。在我的应用程序中,我有深色模式(黑色背景、白色文本)和浅色模式(白色背景、黑色文本)。 针对 API 21+,我使用由 An
我使用以下行来更改 VectorDrawable 的颜色: mydrawable.getBackground().setColorFilter(颜色, PorterDuff.Mode.SRC_ATOP
如何在 View 上删除或撤消 ColorFilter 或 setColorFilter? 最佳答案 您可以为调用 setColorFilter() 的同一对象调用 clearColorFilter(
我想知道是否可以在 View 的 XML 中设置 ColorFilter 或者是否唯一的方法是使用 setColorFilter() 在 Java 中。 最佳答案 有;它被称为 tint .它在 Vi
所以我有一个 ListView,它根据列表中每个项目的优先级对图标进行颜色编码。例如,优先级为 1 的工单有一个红色工单图标。优先级 2 = 黄色等 我使用 ImageView.setColorFil
我是一名优秀的程序员,十分优秀!