Java でペイントするために「反転」クリップ領域を作成する方法はありますか?
質問
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 だったか思い出せません) を変更し、画像に白と黒の領域をペイントすることで、クリップをシミュレートできます。ぜひチェックしてみてください。