【AndroidのCanvasに向き合おう】 描画範囲を制御する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

クリッピングのオプションを指定する

クリッピングするclip系のメソッドは引数にRegion.Opを持つオーバーロードが存在します。
オプションを使用することで描画範囲を複雑に指定することができます。

Region.Opについて

オプションは6種類存在します、これらのオプションは今の描画範囲とメソッドで指定された範囲の二つの範囲を元に描画範囲を決定します。

Region.Op UNION 元の描画範囲と指定された範囲の両方が描画範囲となります。
Region.Op REPLACE 元の描画範囲を指定された範囲に置き換えます。
Region.Op DIFFERENCE 元の描画範囲に対して指定された範囲を削除します。
Region.Op REVERSE_DIFFERENCE 指定された範囲に対して、元の描画範囲を削除した部分が描画範囲になります。
Region.Op INTERSECT 元の描画範囲と指定された範囲の重なる部分が描画範囲となります。
Region.Op XOR 2つの範囲の論理演算XORをとります。

 

クリッピングのオプションを指定して描画範囲を制御する
boolean clipRect(float left, float top, float right, float bottom, Region.Op op) 四角形の左上と右下の座標を指定してオプションに従いクリッピングする。
座標は対象のオリジナルCanvasの左上を原点とします。
ただし、クリップは現在のクリップされた範囲内で行われる。
  • int left:四角形の左上のx座標を指定する。
  • int top:四角形の左上のy座標を指定する。
  • int right:四角形の右下のx座標を指定する。
  • int bottom:四角形の右下のy座標を指定する。
  • Region.Op op:クリッピングのオプションを指定する。
boolean clipRect(Rect rect, Region.Op op) Rectを使用してオプションに従いクリッピングする。
座標は対象のオリジナルCanvasの左上を原点とします。
ただし、クリップは現在のクリップされた範囲内で行われる。
  • Rect rect:クリッピングする四角形で指定する。
  • Region.Op op:クリッピングのオプションを指定する。
boolean clipRect(RectF rect, Region.Op op) RectFを使用してオプションに従いクリッピングする。
座標は対象のオリジナルCanvasの左上を原点とします。
ただし、クリップは現在のクリップされた範囲内で行われる。
  • RectF rect:クリッピングする四角形で指定する。
  • Region.Op op:クリッピングのオプションを指定する。
boolean clipPath(Path path, Region.Op op) Pathを使用してオプションに従いクリッピングする。
座標は対象のオリジナルCanvasの左上を原点とします。
ただし、クリップは現在のクリップされた範囲内で行われる。
  • Paint paint:クリッピングする範囲を指定する。
  • Region.Op op:クリッピングのオプションを指定する。
boolean clipRegion(Region region, Region.Op op) Regionを使用してオプションに従いクリッピングする。
座標は対象のオリジナルCanvasの左上を原点とします。
ただし、クリップは現在のクリップされた範囲内で行われる。 API level 21で非推奨になりました。
clipRect(Rect)を代わりに使用しましょう。
  • Region region:クリッピングする範囲を指定する。
  • Region.Op op:クリッピングのオプションを指定する。
final Rect getClipBounds() 現在クリッピングされている範囲をRectインスタンスとして取得する。
boolean getClipBounds(Rect bounds) 空のRectインスタンスに現在クリッピングされている範囲を設定する。

 

  public class MyCanvasClip extends View{

    public MyCanvasClip(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //幅の1単位を200にする
        int widthUnit = 200;
        //高さの1単位を200にする
        int heightUnit = 200;

        /**
         * canvasの描画範囲を下記の矩形に制限する。
         * 左上座標 [x:0,y:0]
         * 右下座標 [x:400,y:400]
         */
        Rect rect = new Rect(0,0,widthUnit*2,heightUnit*2);
        canvas.clipRect(rect);
        /**
         * canvasの描画範囲から下記の範囲を削除する。
         * 左上座標 [x:200,y:200]
         * 右下座標 [x:400,y:400]
         * Region.Op DIFFERENCE
         * 元の描画範囲に対して指定された範囲を削除します。
         */
        rect = new Rect(widthUnit,heightUnit,widthUnit*2,heightUnit*2);
        canvas.clipRect(rect, Region.Op.DIFFERENCE);
        /**
         * クリッピングされた範囲を黒色に塗りつぶす。
         */
        canvas.drawColor(Color.BLACK);

        /**
         * canvasの描画範囲から下記の範囲に完全に置き換える。
         * 左上座標 [x:0,y:400]
         * 右下座標 [x:400,y:800]
         * Region.Op REPLACE
         * 元の描画範囲を指定された範囲に置き換えます。
         */
        rect = new Rect(0,heightUnit*2,widthUnit*2,heightUnit*4);
        canvas.clipRect(rect, Region.Op.REPLACE);
        /**
         * クリッピングされた範囲を青色に塗りつぶす。
         */
        canvas.drawColor(Color.BLUE);

        /**
         * canvasの描画範囲から下記の範囲に完全に置き換える。
         * 左上座標 [x:0,y:800]
         * 右下座標 [x:400,y:1200]
         * Region.Op REPLACE
         * 元の描画範囲を指定された範囲に置き換えます。
         */
        rect = new Rect(0,heightUnit*4,widthUnit*2,heightUnit*6);
        canvas.clipRect(rect, Region.Op.REPLACE);
        /**
         * canvasの描画範囲を下記の範囲との共通部分に変更する。
         * 左上座標 [x:200,y:1000]
         * 右下座標 [x:400,y:1200]
         * Region.Op INTERSECT
         * 元の描画範囲と指定された範囲の重なる部分が描画範囲となります。
         */
        rect = new Rect(widthUnit,heightUnit*5,widthUnit*2,heightUnit*6);
        canvas.clipRect(rect, Region.Op.INTERSECT);

        /**
         * クリッピングされた範囲を緑色に塗りつぶす。
         */
        canvas.drawColor(Color.GREEN);

        /**
         * canvasの描画範囲から下記の範囲に完全に置き換える。
         * 左上座標 [x:0,y:1200]
         * 右下座標 [x:400,y:1600]
         * Region.Op REPLACE
         * 元の描画範囲を指定された範囲に置き換えます。
         */
        rect = new Rect(0,heightUnit*6,widthUnit*2,heightUnit*8);
        canvas.clipRect(rect, Region.Op.REPLACE);
        /**
         * canvasの描画範囲から下記の範囲に完全に置き換える。
         * 左上座標 [x:0,y:1200]
         * 右下座標 [x:400,y:1600]
         * Region.Op XOR
         * 2つの範囲の論理演算XORをとります。
         */
        rect = new Rect(widthUnit,heightUnit*7,widthUnit*2,heightUnit*8);
        canvas.clipRect(rect, Region.Op.XOR);
        /**
         * クリッピングされた範囲を緑色に塗りつぶす。
         */
        canvas.drawColor(Color.YELLOW);

        rect = new Rect(widthUnit*2,0,widthUnit*4,heightUnit*2);
        canvas.clipRect(rect, Region.Op.REPLACE);
        rect = new Rect(widthUnit*4,0,widthUnit*6,heightUnit*2);

        /**
         * Region.Op UNION
         * 元の描画範囲と指定された範囲の両方が描画範囲となります。
         */
        canvas.clipRect(rect, Region.Op.UNION);
        /**
         * クリッピングされた範囲を緑色に塗りつぶす。
         */
        canvas.drawColor(Color.CYAN);

        /**
         * canvasの描画範囲から下記の範囲に完全に置き換える。
         * 左上座標 [x:400,y:400]
         * 右下座標 [x:800,y:800]
         * Region.Op REPLACE
         * 元の描画範囲を指定された範囲に置き換えます。
         */
        rect = new Rect(widthUnit*2,heightUnit*2,widthUnit*4,heightUnit*4);
        canvas.clipRect(rect, Region.Op.REPLACE);

        /**
         * 下記の描画範囲からcanvasの範囲を削除する。
         * 左上座標 [x:600,y:400]
         * 右下座標 [x:1000,y:800]
         * Region.Op REVERSE_DIFFERENCE
         * 指定された範囲に対して、元の描画範囲を削除した部分が描画範囲になります。
         */
        rect = new Rect(widthUnit*3,heightUnit*2,widthUnit*5,heightUnit*4);
        canvas.clipRect(rect, Region.Op.REVERSE_DIFFERENCE);
        /**
         * クリッピングされた範囲を暗灰色に塗りつぶす。
         */
        canvas.drawColor(Color.DKGRAY);

        /**
         * 現在クリッピングされている範囲を取得する。
         */
        Rect clippedRect = canvas.getClipBounds();
        Toast.makeText(getContext(), clippedRect.toString(), Toast.LENGTH_LONG).show();

        /**
         * 空のRectインスタンスに現在クリッピングされている範囲を設定する。
         */
        Rect bounds = new Rect();
        canvas.getClipBounds(bounds);
        Toast.makeText(getContext(), bounds.toString(), Toast.LENGTH_LONG).show();
    }
}

Androidゲームプログラミング A to Z

新品価格
¥4,968から
(2017/2/27 22:58時点)


AndroidエンジニアのためのモダンJava

新品価格
¥3,456から
(2017/2/27 23:01時点)


AndroidNDKネイティブプログラミング第2版

中古価格
¥1,893から
(2017/2/28 00:04時点)


Androidアプリ開発逆引きレシピ (PROGRAMMER’S RECiPE)

新品価格
¥3,024から
(2017/2/28 00:06時点)


Android Studio ではじめる Android プログラミング入門 第3版 Android Studio 2対応

新品価格
¥3,240から
(2017/2/28 00:11時点)


アプリを作ろう! Android入門 Android Studio版 Android5対応

新品価格
¥2,160から
(2017/2/28 00:31時点)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)