2013-01-17 1 views
2

Graphics2D 렌더링에서 펀치 아웃 효과를 만들려고합니다.Graphics2D를 사용하여 "펀치 아웃"텍스트 구현

나는 검은 색 사각형을 가지고 있습니다. 텍스트가 빨간색으로 표시됩니다. 색상을 0x00FF0000으로 설정하고 뒷 배경에서 "펀치 아웃 (punch out)"할 수 있기를 원합니다.

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); 

내가 보는 것은 텍스트가 배경과 완전히 투명하지만 펀치 아웃하지 않는다는 것입니다.

내가 볼 무엇 : http://i.imgur.com/YQwZk.jpg

어떻게의 Graphics2D를 사용하여 '펀치 아웃'효과를 얻을 수 있습니다 : 내가 볼 것으로 예상 무엇 http://i.imgur.com/HYTe1.jpg

?

편집 : 펀치 아웃 효과는 전경이 0x00FF0000으로 설정되고 뒷 배경이 0xFF000000 인 JLabel을 사용하는 것과 같습니다. 그것은 뒤쪽에서 텍스트를 "잘라냅니다"/ "펀치 아웃"합니다. 또한 항상 알파가 0 일 때만 펀치 아웃하는 것을 원하지 않습니다.

EDIT2 : Ive는 아래의 sugested 코드를 동일한 결과로 시도했습니다.

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); 

답변

1

당신은 같은 것을 의미하는 경우 :

enter image description here 당신은 렌더링 할 다음, 개요 텍스트의 Shape을 얻을 결합 Shape을 만들 Path2D를 사용할 필요가

:

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++; 
     } 
    } 
} 
+0

이 어떻게 그런 클래스 Path2D을 사용하고 있습니다 :

그러나, 이미이 같은 Path2D의 consrtuctor에서 구현? Java 7u11에 대한 요약 – meriley

+0

Path2D.double (Shape)이 필요합니다. – meriley

+0

또한이 구현에서도 동일한 결과가 나타납니다. – meriley

0

appendTextShape 메서드가 작동 중입니다.

Path2D path = new Path2D.Double(shape, affineTransform);