4

我想使用 Graphics.fillRoundRect() 填充一个区域,但我希望它中间的一个矩形被填充。

本质上,给定一个 100x30 的组件,我想将裁剪设置为 10,10 大小为 80x10 的矩形,但填充仅绘制该80x10 矩形之外的区域。原因是我想要在不影响内部组件区域的情况下绘制一个带有弯曲轮廓的 n 像素边框。

到目前为止我能看到的最好的方法是剪辑到 10,10 90x10 并执行 fillRoundRect() 然后剪辑到 90,10 10x10 并执行 fillRect() 来填充右侧、角落下方和上方。

如果我简单地重新绘制一个单线矩形,那么我最终会在拐角处出现“斑点”,因为曲线不太邻接(和/或因为 AA 会影响周围的像素)。

编辑:警告 - 我需要一种可以与 J2ME AWT(具有个人配置文件 1.1 的 CDC)以及 J2SE 一起使用的方法。


编辑:另一个类似的问题有一个我能够适应的答案。适合我的情况的代码作为自我回答发布。

4

2 回答 2

2

我对另一个问题也有类似的答案,即使用多边形作为 AWT 剪辑。也许这在 J2ME 中受支持?您需要知道要排除的矩形的边界以及绘图区域的外部边界。

+-------------------+
| 剪辑绘图区|
+---+-----------+ |
| | 排除 | |
| | 面积 | |
| +-----------+ |
| |
+-------------------+

从 OP 编辑​​。

这个答案对我有用,并且 J2ME 支持 API。另一个问题的答案似乎有一个错误 - 坐标集需要从左外角和内顶部的点开始,以创建封闭的多边形。我的最终代码如下:

为了创建一个剪切形状,我使用了这个方法:

static public Shape getOutsideEdge(Graphics gc, Rectangle bb, int top, int lft, int btm, int rgt) {
    int                                 ot=bb.y            , it=(ot+top);
    int                                 ol=bb.x            , il=(ol+lft);
    int                                 ob=(bb.y+bb.height), ib=(ob-btm);
    int                                 or=(bb.x+bb.width ), ir=(or-rgt);

    return new Polygon(
     new int[]{ ol, ol, or, or, ol, ol,   il, ir, ir, il, il },
     new int[]{ it, ot, ot, ob, ob, it,   it, it, ib, ib, it },
     11
     );
    }

我将其设置到 Graphics 上下文中,然后填充我的矩形:

Rectangle tmp=new Rectangle(px,py,pw,ph);
gc.setClip(getOutsideEdge(gc,tmp,thickness,thickness,thickness,thickness));
gc.fillRoundRect(px,py,pw,ph,RADIUS,RADIUS);

然后我通过在每个角上画一个点来创造圆角内角的错觉:

gc.setClip(px,py,pw,ph);
gc.drawLine((px   +thickness  ),(py   +thickness  ),(px   +thickness  ),(py   +thickness  ));
gc.drawLine((px+pw-thickness-1),(py   +thickness  ),(px+pw-thickness-1),(py   +thickness  ));
gc.drawLine((px   +thickness  ),(py+ph-thickness-1),(px   +thickness  ),(py+ph-thickness-1));
gc.drawLine((px+pw-thickness-1),(py+ph-thickness-1),(px+pw-thickness-1),(py+ph-thickness-1));
于 2009-08-15T07:54:14.923 回答
1

请检查我对这个问题的回答。它非常相似。

编辑:您可能想检查 AlphaComposite 在 j2me 中是否可用。在 Java 中,您可以通过更改 alpha 复合模式(我不记得我认为它的 srcIn 到底是哪个)以及在具有黑白区域的图像上绘画来模拟剪辑。你可能想检查一下。

于 2009-08-13T18:19:54.213 回答