我正在尝试在Graphics2D渲染上创建一个Punch Out效果。
我有一个黑色的矩形。文字红色。我希望能够将颜色设置为0x00FF0000并让它“冲出”背景。
Graphics2D newG = (Graphics2D)g.create();
newG.setColor(new Color(0x00,0x00,0x00,0xFF)); //255 Alpha
newG.fillRect(box.x, box.y, box.width, box.height);
newG.setColor(new Color(0xFF,0x00,0x00,0x00)); //0 Alpha
newG.drawString("Welcome", box.x ,box.y);
我看到的是文字在背景上完全透明,但没有打出来。
我看到的内容:
我期望看到的内容:
如何使用Graphics2D实现'打孔'效果?
编辑:Punch-Out效果就像使用前景设置为0x00FF0000的JLabel和Back Ground 0xFF000000。它从后台“切出”/“打出”文本。此外,我不希望它总是冲出来,只有当alpha为0时才会打出。
EDIT2:我尝试了下面提到的相同结果的代码。
Rectangle stringBox = new Rectangle(x, y - fm.getHeight() + fm.getDescent(), fm.stringWidth(splitStr[i]), fm.getHeight());
TextLayout textLO = new TextLayout(splitStr[i], newG.getFont(), newG.getFontRenderContext());
Shape sText = textLO.getOutline(newG.getTransform()); // The Shape of text
Path2D.Double shape = new Path2D.Double(stringBox); // The rectangle
appendTextShape(shape, sText, newG.getTransform(), 0, 10);
newG.setColor(Color.black);
newG.fill(shape);
newG.setColor(new Color(0xFF, 0x00,0x00,0x00));
newG.drawString(splitStr[i], x, y);
答案 0 :(得分:1)
如果你的意思是:
您需要获取文字的大纲Shape
,然后使用Path2D
创建合并的Shape
来呈现:
Graphics2D g2d = ...;
TextLayout text = new TextLayout("Welcome", g2d.getFont(), g2d.getFontRenderContext());
Shape sText = text.getOutline(g2d.getTransform()); // The Shape of text
Path2D shape = new Path2D.Double(new Rectangle(200, 100)); // The rectangle
appendTextShape(shape, sText, g2d.getTransform(), 0, 10); // combine the shape
g2d.setColor(Color.BLACK);
g2d.fill(rect);
appendTextShape
方法就在这里:
public void appendTextShape (Path2D p, Shape s, AffineTransform t, int x, int y) {
synchronized (s) {
PathIterator pit = s.getPathIterator(t);
float[] coords = new float[6];
int c = 0;
while (true) {
pit.next();
if (pit.isDone()) {
break;
}
switch (pit.currentSegment(coords)) {
case PathIterator.SEG_MOVETO:
p.moveTo(x + coords[0], y + coords[1]);
break;
case PathIterator.SEG_LINETO:
if (c == 0) {
p.moveTo(x + coords[0], y + coords[1]);
} else {
p.lineTo(x + coords[0], y + coords[1]);
}
break;
case PathIterator.SEG_QUADTO:
if (c == 0) {
p.moveTo(x + coords[0], y + coords[1]);
} else {
p.quadTo(x + coords[0], y + coords[1], x + coords[2], y + coords[3]);
}
break;
case PathIterator.SEG_CUBICTO:
if (c == 0) {
p.moveTo(x + coords[0], y + coords[1]);
} else {
p.curveTo(x + coords[0], y + coords[1], x + coords[2], y + coords[3], x + coords[4], y + coords[5]);
}
break;
case PathIterator.SEG_CLOSE:
p.closePath();
break;
}
c++;
}
}
}
答案 1 :(得分:1)
http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html
正确设置成分是解决方案。 SRC_IN是我正在寻找的作品。
答案 2 :(得分:0)
您的appendTextShape
方法正常运作。
但是,它已经在Path2D
的支持者中实现,如下所示:
Path2D path = new Path2D.Double(shape, affineTransform);