您正在寻找的颜色混合有时称为直观的颜色混合,或RYB 颜色系统:
RYB:
CC license
引自 Nathan Gossett 和 Baoquan Chen 关于直观颜色混合算法的 this 论文,总结了直观颜色系统的工作原理:
“在这个模型中,红色、黄色和蓝色用作纯原色。红色和黄色混合形成橙色,黄色和蓝色混合形成绿色,蓝色和红色混合形成紫色[...]。这些是未经训练的观众期望使用儿童颜料获得的颜色[...]。此外,许多人并不认为白色是所有颜色的混合,而是认为没有颜色(空白画布)。一个更常见的假设是,将多种颜色混合在一起会产生浑浊的深棕色。”
RYB 未在 Android 的混合模式中实现,并且无法通过混合 alpha/不同的混合模式来真正模拟。
大多数计算机图形应用程序都使用 RGB 或 CMYK 色彩空间:
CMYK:
CC license
CMY 基于减色法。减色混合意味着,从白色开始,随着我们添加颜色,结果变得更暗。 CMYK 用于混合用于打印的图像中的颜色,例如Photoshop 和 Illustrator。
RGB:
CC license
RGB 基于加色法。计算机屏幕上的颜色是使用加色法用光创建的。加色混合从黑色开始,随着颜色的增加,结果会变浅并以白色结束。
This 网站更详细地讨论了 CMYK 和 RGB。
在 RGB 和 CMYK 中,混合蓝色和黄色都不会产生绿色,或者一般来说,直观的颜色混合。在 Android 上实现一个 RYB 颜色系统将是相当复杂的。上面引用的 Nathan Gossett 和 Baoquan Chen 的论文在论文的最后提出了一个用 C 语言实现的算法的解决方案。该算法可以在 Android 上的自定义混合中实现。 Drawable.setColorFilter() 使用 PorterDuffColorfilter 扩展 ColorFilter。如this SO 问题中所述,子类化ColorFilter 必须使用NDK 在本机代码中完成。
CMYK 颜色混合解决方法
如果您有兴趣使用 CMYK 颜色混合作为解决方法,我在下面提供了一个基本示例来说明如何完成。在这个例子中,一个青色圆圈和一个黄色圆圈将被混合以产生一个绿色的交点。
从在 Adobe Illustrator 中创建的这些 .png 图像文件开始:
十六进制颜色值为 0x00ffff(青色)和 0xffff00(黄色)。
将它们添加到名称为 cyancircle.png 和 yellowcircle.png 的可绘制文件夹中。
如下配置你的 main.xml 布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ffffff"
android:padding="30dp">
<ImageView
android:id="@+id/bluecircle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/cyancircle">
</ImageView>
<ImageView
android:id="@+id/yellowcircle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/yellowcircle"
android:layout_marginTop="30dp">
</ImageView>
</RelativeLayout>
创建您的活动:
import android.app.Activity;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.widget.ImageView;
public class PorterDuffTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView yellowCircle = (ImageView)findViewById(R.id.yellowcircle);
yellowCircle.getDrawable().setColorFilter(0x88ffff00, PorterDuff.Mode.MULTIPLY);
}
}
输出:
此方法的限制是顶部形状的 alpha 必须设置为 50%(“0x88ffff00”中的“88”)。对于黄色,这可以很好地工作,但对于其他颜色,alpha 效果可能不可接受(颜色可能看起来是另一种颜色,例如红色变成粉红色,白色背景上的 alpha 值较低)。您最终可以接受哪种混合模式取决于您要使用的颜色集,并且需要进行一些实验。另请注意,背景颜色可能会影响混合模式下圆圈的颜色。在本例中,背景设置为白色。