web-dev-qa-db-ja.com

clipRectの使用-説明

public class POCII extends Activity { 

    myView mv = new myView(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(mv); 
    }
}


class myView extends View { 

    public myView(Context context) { 
       super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

        Paint paint = new Paint(); 

        canvas.drawRect(0,0,100,100, Paint); 
        canvas.clipRect(0,0,50,50);
    } 
}

私の質問は、上記のコードで長方形を描画してから左上の部分をトリミングしないことです。長方形が切り取られていません。

ClipRectの機能について説明してください。それは実際に何がクリッピングですか?座標を考慮して、長方形の形でクリップしますか?もしそうなら、なぜ上記のコードが機能しないのですか?

40
Namratha

Canvas.clipRect(left, top, right, bottom) 今後の描画操作で書き込み可能な画面の領域を減らします。現在のクリッピング四角形と指定された四角形の空間的な交差になるようにclipBoundsを設定します。領域のさまざまなフォームを受け入れ、クリッピング四角形に対するさまざまな操作を許可するclipRectメソッドには、多くのバリアントがあります。クリッピング領域を明示的に設定したい場合は、以下を試してください:

canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE);

5番目の引数は、以前のバージョンとの交差を作成するのではなく、クリッピング長方形を置き換えることを意味します。

DrawRectステートメントの前にclipRectステートメントを移動してみてください。または、追加してみてください:

Paint.setColor(Color.YELLOW);
drawRect(0,0,75,75);

既存のclipRectステートメントの後。それはあなたが以前持っていたものの上に50x50の黄色の四角を描くはずです。

別のメモ:(明らかに、ほとんど文書化されていないView/ViewGroup/drawingコードに長い不満を感じた後)canvas.translate(x、y)もclipRectを調整することがわかりました。 clipRectと描画マトリックスの相互作用は非常に混乱します。印刷すると便利です。

canvas.getMatrix()

そして

canvas.getClipBounds()

キャンバスの変更前と変更後、描画前。

79
Ribo

左上の部分をトリミングするには、次の操作を行います。

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE);
// secondly...
canvas.drawRect(0,0,100,100, Paint); 
5
Matt Hansen

ICS以降...

XOR、Difference、ReverseDifferenceのクリップモードは、ハードウェアアクセラレーションが有効になっている場合、ICSによって無視されます。

ビューで2Dハードウェアアクセラレーションを無効にするだけです。

myView.setLayerType(View.LAYER_TYPE_SOFTWARE、null);

リファレンス Android:API15でのclipRectの使用方法

4
SHS

図面は、cliprectを使用しないと次のようになります。

enter image description here

ここで、cliprectを使用する場合は、既に持っているものの上に長方形のオーバーレイを配置します。その種の目に見えない。次を呼び出したとしましょう:

 override fun onDraw(canvas: Canvas) {

        val Paint =  Paint();
        Paint.color = Color.RED
        canvas.clipRect(0f,0f,500f,500f, Region.Op.DIFFERENCE);
// secondly...
        canvas.drawRect(0f,0f,1000f,1000f, Paint);
    }

dIFFERENCEオプションを使用していて、クリッピング四角形がキャンバスの赤い四角形の上にあることがわかっているので、特別なことがわかります。上記は、クリッピング四角形と元の四角形の違いを維持する必要があることを示しています。したがって、次のようになります(四角形のクリッピングに1000の半分を使用したため)。

enter image description here

oppositeを使用すると、次のようになります。 enter image description here

誰かがそれを角の丸いものにすることができるかどうかを確認したいです。

0
j2emanue