グラフィックス(9)-描画領域のクリップ
描画領域をクリップすると、クリップされた領域のみが描画対象になります。
クリップする領域を指定するCanvasクラスのメソッド
以下のCanvasクラスのメソッドを使って、クリップする領域を指定します。
- boolean clipRect(float left, float top, float right, float bottom)
float型の引数left, top, right, bottomで指定された矩形領域を、Region.Op.INTERSECTでクリップします。 - boolean clipRect(float left, float top, float right, float bottom, Region.Op op)
float型の引数left, top, right, bottomで指定された矩形領域を、Region.Opの指定に従ってクリップします。 - boolean clipRect(int left, int top, int right, int bottom)
int型の引数left, top, right, bottomで指定された矩形領域を、Region.Op.INTERSECTでクリップします。 - boolean clipRect(Rect rect)
Rectオブジェクトで指定された矩形領域を、Region.Op.INTERSECTでクリップします。 - boolean clipRect(Rect rect, Region.Op op)
Rectオブジェクトで指定された矩形領域を、Region.Opの指定に従ってクリップします。 - boolean clipRect(RectF rect)
RectFオブジェクトで指定された矩形領域を、Region.Op.INTERSECTでクリップします。 - boolean clipRect(RectF rect, Region.Op op)
RectFオブジェクトで指定された矩形領域を、Region.Opの指定に従ってクリップします。 - boolean clipRegion(Region region)
Regionオブジェクトで指定された矩形領域を、Region.Op.INTERSECTでクリップします。 - boolean clipRegion(Region region, Region.Op op)
Regionオブジェクトで指定された矩形領域を、Region.Opの指定に従ってクリップします。 - boolean clipPath(Path path)
pathで指定された領域を、Region.Op.INTERSECTでクリップします。 - boolean clipPath(Path path, Region.Op op)
pathで指定された領域を、Region.Opの指定に従ってクリップします。
これらのメソッドは、戻り値として、クリップされた領域が存在しない場合(空の場合)は、falseを返します。
引数のEnum型、Region.Opは、元の描画領域と指定されたクリップ領域との結合の方法を示す以下の値が、定義されています。
- public static final Region.Op DIFFERENCE
元の描画領域に対して、指定された領域を、削除します。 - public static final Region.Op INTERSECT
元の描画領域と指定された領域の重なる部分が、描画領域となります。 - public static final Region.Op REPLACE
元の描画領域を、指定された領域に、置き換えます。 - public static final Region.Op REVERSE_DIFFERENCE
指定された領域に対して、元の描画領域を削除した部分が、描画領域になります。 - public static final Region.Op UNION
元の描画領域と指定された領域の両方が、描画領域となります。 - public static final Region.Op XOR
2つの領域の論理演算XORを、とります。
描画領域のクリップしてグラフィックを描画するプログラムの例
clipRectメソッド
以下のプログラムは、クリップ領域を指定してBitmap画像を表示した例です。
このプログラムを実行するには、res/drawableデレクトリに画像ファイルsample.JPGが必要です。
リスト1-clipRectメソッドのサンプル
このプログラムの、最初の行に定義されている変数opの値を変化させて、プログラムを実行すると、以下のように表示されます。
DIFFERENCE
INTERSECT
REPLACE
REVERSE_DIFFERENCE
UNION
XOR
Region.Opの値によって、クリップ領域がどのように変化するかが、わかると思います。
clipPathメソッド
次のプログラムは、clipPathメソッドの例です。
リスト2-clipPathメソッドのサンプル
このプログラムを実行すると、以下のように表示されます。
Pathについては、Pathによる描画を参照して下さい。
clipRegionメソッド
次のプログラムは、clipRegionメソッドの例です。
リスト3-clipRegionメソッドのサンプル
このプログラムを実行すると、以下のように表示されます。
クリップされる領域が、リスト1のRegion.OpがUNIONの場合の画面と比較すると、Rectによる座標の指定より、y軸の座標が50ずれています。
APIのバグなのかRegionクラスの仕様なのかは、不明です。
クリップに関するその他のCanvasクラスのメソッド
Canvasクラスには、他にもクリップに関するメソッドがあります。
「Android Developers」のCanvasクラスのリファレンスより、以下に抜粋します。
- final Rect getClipBounds()
Retrieve the clip bounds. - boolean getClipBounds(Rect bounds)
Retrieve the clip bounds, returning true if they are non-empty.
参考URL
- Android Developers