Java でペイントするために「反転」クリップ領域を作成する方法はありますか?

StackOverflow https://stackoverflow.com/questions/1273688

  •  16-09-2019
  •  | 
  •  

質問

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

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

これまでのところ私が確認した最良の方法は、10,10 90x10 にクリップして fillRoundRect() を実行し、次に 90,10 10x10 にクリップして fillRect() を実行して右側の角の下と上を塗りつぶすことです。

単線の長方形を単純に再ペイントすると、曲線が完全に接していないため (および/または AA が周囲のピクセルに影響を与えるため)、角に「斑点」ができてしまいます。

編集:警告 - J2SE だけでなく J2ME AWT (パーソナル プロファイル 1.1 を備えた CDC) でも動作する方法が必要です。


編集:別の 同様の質問 持っています 答え 適応することができました。私の状況で正しく動作するコードは自己回答として投稿されています。

役に立ちましたか?

解決

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

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

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

これをグラフィックスコンテキストに設定し、四角形を塗りつぶしました。

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

他のヒント

私の答えを確認してください これ 質問。とてもよく似ています。

編集:AlphaComposite が j2me で利用できるかどうかを確認してください。Java では、アルファ合成モード (正確にどれが srcIn だったか思い出せません) を変更し、画像に白と黒の領域をペイントすることで、クリップをシミュレートできます。ぜひチェックしてみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top