首先这个标题不准确,需要的结果类似下图,注意中间圆形部分是透明的
镂空一个圆形
Graphics2D提供方法clearRect,可以清除出一个矩形区域,但没有clearCircle或者clearArc, clearEllipse等,通过清除的来实现不太可能。
实现思路可从描画部分入手,使用 Graphics2D 的 setClip 方法,在描画前把那个要剪出来的圆排除在外。 参照如下代码
1 2 3 4 5 6 7
| Area a = new Area(new Rectangle(0, 0, 1200, 1200)); Ellipse2D circle = new Ellipse2D.Float(100, 100, 1000, 1000); a.subtract(new Area(circle)); g.setClip(a); g.setColor(new Color(255, 255, 192)); g.fillRect(0, 0, 1200, 1200);
|
金保留文字部分,其余部分镂空
把一张图除文字外的部分剔除掉,实现如下图所示效果
也是利用 graphics2d 的 setClip 方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| FontRenderContext frc = g.getFontRenderContext(); Font font = arial.deriveFont(Font.BOLD, 260); GlyphVector gv = font.createGlyphVector(frc, "10"); Rectangle2D box = gv.getVisualBounds();
int xOff = (int) (bgImg.getWidth() - box.getWidth()) / 2; int yOff = (int) (bgImg.getHeight() + box.getHeight()) / 2;
Shape shape = gv.getOutline(xOff, yOff); g.setClip(shape); g.drawImage(bgImg, 0, 0, null); g.setClip(null);
g.setStroke(new BasicStroke(1f)); g.setColor(Color.RED); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.draw(shape);
|