3.5 クリッピング
3.5.1 描画領域の制限
Graphics オブジェクトは、描画することが可能な範囲を表す現在のクリップを保持しています。デフォルトでは、Graphics オブジェクトが参照するコンポーネントやデバイスのサイズが現在のクリップですが、特定の領域に設定することで、現在のクリップを変更することができます。
現在のクリップの範囲の外には描画することができません。クリッピング領域外でレンダリング操作を行なっても効果はないのです。描画範囲が広ければ、当然コンピュータには負担となりますが、必要な範囲だけをクリップし、描画する必要の無い範囲は描画の対象外とすることで処理速度を向上させることができます。他にも、円形の形にクリッピングすることで、画像ファイルの特定部分を円形に描画するといった特殊な演出に実用することもできるでしょう。
Graphics オブジェクトの現在のクリップを変更するには setClip() メソッドを、現在のクリップ領域を得るには getClip() メソッドを使います。
public abstract void setClip(int x, int y, int width, int height)
public abstract void setClip(Shape clip)
public abstract Shape getClip()
x パラメータ、y パラメータ、width パラメータ、height パラメータには、それぞれ新しいクリップ領域の開始 X 座標、Y 座標、幅、高さを指定します。この矩形領域が新しいクリップとなります。clip は、形を提供する Shape インタフェースのオブジェクトを渡します。getClip() メソッドも、同様に Shape インタフェースのオブジェクトを返します。
java.awt.Shape インタフェースは、Rectangle や Polygon クラスなどで実装されているインタフェースです。Shape インタフェースは、指定した座標が形の境界内部に存在するかどうかを調べるメソッドなどを提供しているため、グラフィカルな領域の選択範囲を特定するときなどに便利です。そのため、クリップ処理に適しています。
Rectangle や Polygon クラス以外の Shape インタフェースのより詳細な実装は java.awt.geom パッケージが提供しています。
import java.applet.Applet; import java.awt.*; import java.awt.geom.*; //<applet code="Test.class" width="400" height= "300"></applet> public class Test extends Applet { public void paint(Graphics g) { g.setClip(new Ellipse2D.Double(0 , 0 , 400 , 300)); for(int i = 0 ; i < 300 ; i += 5) g.drawLine(0 , i , 400 , i); for(int i = 0 ; i < 400 ; i += 5) g.drawLine(i , 0 , i , 300); } }
コード1は、最初に setClip() メソッドを呼び出して現在のクリップを楕円形に選択し、その後、縦横にラインを描画しています。デフォルトのクリップ範囲では単純に線が描画されるだけですが、このプログラムでは Ellipse2D.Double オブジェクトでクリッピングしているため、オブジェクトが現している楕円形の外には描画されません。そのため、実行結果のように、楕円形に網模様が表示されるのです。