我想使用 Graphics.fillRoundRect() 填充一个区域,但我想要在它的中间有一个矩形 不是 变得充实。

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

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

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

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


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

有帮助吗?

解决方案

我对其他问题一个类似的回答也这是使用一个多边形作为AWT剪辑。也许这是J2ME的支持?你需要知道你要排除的矩形的界限,你的绘图区域的外部边界。

+-------------------+
| clip drawing area |
+---+-----------+   |
|   | excluded  |   |
|   |   area    |   |
|   +-----------+   |
|                   |
+-------------------+

EDIT FROM OP。

这答案为我工作和API的支持J2ME的。其他问题的答案似乎有一个错误 - 该组坐标的需要,以创造一个封闭的多边形开始在外左和内顶部的点。我的作用后最终的代码如下:

要创建剪切形状,我使用这种方法:

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

我设置到图形上下文,然后填充我的矩形:

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

其他提示

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

编辑:你可能要检查的AlphaComposite是在J2ME中可用。在Java中,你可以模拟通过改变阿尔法混合模式剪辑(我不记得哪个正是我认为它srcIn),并有黑色和白色区域的图像上画。您可能要检查它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top