答案 0 :(得分:4)
将您的文本呈现到PGraphics对象中,然后遍历该对象的pixel []以更改部分文本的颜色。
在下面的示例中,除非您创建具有文本确切尺寸的PGraphics对象,否则颜色比率将不正确-我不确定是否存在以编程方式确定所需尺寸的方法。 (因此,我使用0.6的比率为示例中文本的顶部〜50%重新着色)。
此外,在对象上调用了 noSmooth(),因为抗锯齿将创建与原始文本颜色不完全相同的像素,这使得替换像素比简单地检查相等性< em>(==)。
import processing.core.PApplet;
import processing.core.PGraphics;
public class Text extends PApplet {
PGraphics text;
public static void main(String[] args) {
PApplet.main(Text.class);
}
@Override
public void settings() {
size(400, 400);
}
@Override
public void setup() {
makeText();
}
@Override
public void draw() {
background(55);
image(text, 100, 100);
}
public void makeText() {
final int orange = color(255,165,0);
final int yellow = color(255,255,0);
final float ratio = 0.6f;
text = createGraphics(150, 60);
text.noSmooth();
text.beginDraw();
text.fill(orange);
text.textSize(60);
text.textAlign(LEFT, TOP);
text.loadPixels();
text.text("TEXT", 0, 0);
text.endDraw();
for (int pixel = 0; pixel < (text.pixels.length * ratio); pixel++) {
if (text.pixels[pixel] == orange) {
text.pixels[pixel] = yellow;
}
}
}
}
这是一种骇人听闻的方法,但是由于文本经过了抗锯齿处理,因此效果更好。此方法要求您的草图处于FX2D
渲染模式,可以在size()
调用中指定。
暴露属于PApplet的stackPane(这是将在其中添加JavaFX文本对象的地方):
Canvas canvas = (Canvas) ((PSurfaceFX) getSurface()).getNative();
StackPane p = (StackPane) canvas.getParent();
创建一个JavaFX文本对象。我正在使用CSS样式(具有立即截止的线性渐变)来实现部分着色的效果。
javafx.scene.text.Text t = new javafx.scene.text.Text("TEXT");
t.setCache(true);
t.setFont(Font.font(null, FontWeight.NORMAL, 60));
t.setStyle("-fx-fill:linear-gradient( from 100.0% 100.0% to 100.0% 0.0%, rgb(255, 165, 0) 0.5," + "rgb(255, 255, 0)" +" 0.5);");
最后,将文本添加到PApplet的阶段堆栈窗格(前面已公开):
p.getChildren().add(t);
还请注意,由于此文本元素与Processing的绘图画布完全分开,因此您将需要使用t.setVisible()
来切换可见性。