【问题标题】:Does setColorFilter affect ONLY src, or src AND background?setColorFilter 是否仅影响 src 或 src 和背景?
【发布时间】:2014-06-28 12:51:19
【问题描述】:

注意 - 这个问题涉及 android:background 属性。

令人困惑的是,“背景”也经常用于简单地表示“用于 Android 的照片的‘背景颜色’:src”。

说我有。

<ImageView
  android:src="@drawable/white_foreground_thing"
  android:background="@drawable/some_bg_thing"
  />

我要更改 setColorFilter

事实上,这是否会影响仅影响“src” - 即前景

或者它也会影响背景。?

android:background="@drawable/some_bg_thing"

在我的示例中,前景(即 src)是一个 40 像素的白点(因此,我将制作“不同颜色的点”)。

但是背景只是一个普通的按钮背景,实际上还有一些透明度等等。

所以我不想影响背景;我将只更改不同按钮的“大点颜色”。

请注意,(a) 使用 setColorFilter 的微妙之处很难从测试中确定,并且 (b) 我真的在 doco 中找不到这个(对于 Android 家伙来说可能很明显!)

进一步 - PosterDuff.Mode 与此处相关吗?还是完全不相关?

(例如,https://stackoverflow.com/a/18954101/294884

顺便说一句,在许多情况下,这里是一个绝妙的解决方案。 https://stackoverflow.com/a/17756634/294884

(注意底部的彩色圆点)

但是在这里,我只想知道到底 setColorFilter 是影响 .background 还是只影响 .src

【问题讨论】:

  • is the PosterDuff.Mode relevant here? 哦,是的。 很多。我发现这个page 真的很有启发性。请阅读并了解不同的 Porter Duff 模式将如何影响绘图。
  • 现在要明确一点.. 我的意思是 IMAGEVIEW 的实际“背景属性”。我不是指“照片”的“背景”。 (因此,想象一下 .src 是“一张以蓝天为背景的猫的照片”。)我意识到您可以在使用滤镜时以某种方式使用矩阵来梳理颜色。但在这里,我的意思是,过滤器是否仅影响整个图像视图的 "android:background="@drawable/blah"" 方面......或者仅影响 src?
  • 不,只有您应用过滤器的图像。即:src,在这种情况下。我提供了一个类似问题的答案(将叠加图像的颜色更改为另一个)-您可能会觉得这很有趣:here
  • 太棒了!我想这就是答案..更好的帖子作为答案? (此站点上没有缩放按钮。)

标签: android android-imageview android-drawable


【解决方案1】:

不,只有您应用过滤器的图像。即:源代码。


现在这就是我如何叠加几张图像并更改其中一张的颜色。
您可以尝试将 @drawable/head_xxh 设置为 imgHairbackground(因此,去掉一个 ImageView),看看它是否可以作为预计。

结果被引用到两个独立且重叠的 ImageView。

只是为了好玩和好奇,我尝试自己实现您的想法。
准备好以下两个 xxhdpi 图像(480 dpi,为了使它们能够很好地缩放 - 然后我把它们放在/res/drawable-xxhdpi 文件夹中)

当然,我必须仔细调整图像的大小以完美匹配和重叠。

和一头白发(你的复制品,“发白” - 去饱和度 + 调整亮度/对比度)

我做了这个布局,其中头发图像与头部重叠:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f000"
    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/head_xxh"
    />
    <ImageView
        android:id="@+id/imgHair"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/hair_wht_xxh"
    />
    <Button
        android:id="@+id/btnColor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Random hair color"
        android:onClick="clickHandler"
    />
</RelativeLayout>

这是我使用的代码:

package com.dergolem.abc_2;

import java.util.Random;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;

public class Generic
extends Activity
{
    Random rnd = new Random();

    Button btn = null;
    ImageView img = null;

    @Override
    public void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.hair);

        img = (ImageView) findViewById(R.id.imgHair);
        btn = (Button) findViewById(R.id.btnColor);
    }

    public void clickHandler(final View v)
    {
        colorize(rnd.nextInt(7));
    }

    private void colorize(final int num)
    {
        int clr = Color.WHITE;
        switch (num)
        {
            case 0:
            {
                clr = Color.RED;
                break;
            }
            case 1:
            {
                clr = Color.GREEN;
                break;
            }
            case 2:
            {
                clr = Color.BLUE;
                break;
            }
            case 3:
            {
                clr = Color.BLACK;
                break;
            }
            case 4:
            {
                clr = Color.CYAN;
                break;
            }
            case 5:
            {
                clr = Color.YELLOW;
                break;
            }
            case 6:
            {
                clr = Color.parseColor("#ff888800");
                break;
            }
        }

        img.setColorFilter(clr, PorterDuff.Mode.MULTIPLY);
    }
}

以及我得到的一些结果:

即使这幅作品看起来像是安迪·沃罗尔的作品,但事实并非如此。这是我的。 :)
这似乎是您正在寻找的结果。

[编辑]

我没有尝试这个新想法,但是(通过一些额外的工作)您甚至可以更改其他颜色:

  • 眼睛
  • 皮肤
  • 口红
  • 眼妆(这需要一些耐心)

【讨论】:

  • 哇!你喜欢 CUBITAL 个字符! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多