4

Graphics.fillRoundRect() を使用して領域を塗りつぶしたいのですが、その中央にある四角形を塗りつぶしたくないのです。

基本的に、100x30 のコンポーネントが与えられた場合、クリッピングをサイズ 80x10 の 10,10 の長方形に設定したいのですが、その 80x10 の長方形の外側の領域のみを塗りつぶします。その理由は、内側のコンポーネント領域に影響を与えずに、曲線の輪郭が描かれた n ピクセルの境界線が必要だからです。

これまでのところ、10,10 90x10 にクリップし、fillRoundRect() を実行してから、90,10 10x10 にクリップし、fillRect() を実行して、コーナーの上下の右側を埋めるのが最善の方法です。

単一の線の長方形を単純に再描画すると、曲線が完全に隣接しないため(および/またはAAが周囲のピクセルに影響するため)、コーナーに「斑点」ができます。

編集: 警告 - J2ME AWT (CDC with Personal Profile 1.1) および J2SE で動作する方法が必要です。


編集:別の同様の質問には、私が適応できた答えがあります。私の状況で正しく機能するコードは、自己回答として投稿されています。

4

2 に答える 2

2

ポリゴンを AWT クリップとして使用するという他の質問についても同様の回答があります。これは J2ME でサポートされているのでしょうか。除外する四角形の境界と、描画領域の外側の境界を知る必要があります。

+---------------------+
| | クリップ描画領域 |
+---+-----------+ |
| | | | 除外 | | |
| | | | エリア | | |
| | +---------+ |
| | | |
+---------------------+

OPから編集。

この答えは私にとってはうまくいき、APIはJ2MEでサポートされています。他の質問の答えには1つの間違いがあるようです.囲まれた多角形を作成するには、座標のセットが外側の左と内側の上にある点を開始する必要があります. 動作した私の最終的なコードは次のとおりです。

クリッピング シェイプを作成するには、次の方法を使用しました。

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

次に、各コーナーに 1 つのドットをペイントして、内側のコーナーが丸くなっているような錯覚を作成しました。

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 では、アルファ合成モードを変更することでクリップをシミュレートできます (srcIn を正確に思い出すことはできません)。黒と白の領域で画像をペイントします。あなたはそれをチェックしたいかもしれません。

于 2009-08-13T18:19:54.213 に答える