47
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 が何をするのか説明してください。実際にクリッピングとは何ですか?座標を指定すると、長方形の形でクリップされますか? もしそうなら、なぜ上記のコードが機能しないのですか?

4

4 に答える 4

84

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 /描画コードに長い間不満を感じていた後)canvas.translate(x、y)もclipRectを調整することがわかりました。clipRectと描画マトリックスの相互作用は非常に混乱します。次の点を指摘しておくと役に立ちます。

canvas.getMatrix()

canvas.getClipBounds()

キャンバスを変更する前と変更した後、物を描く前。

于 2011-01-10T21:25:29.070 に答える
5

左上部分をトリミングするには、次のようにします。

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE);
// secondly...
canvas.drawRect(0,0,100,100, paint); 
于 2012-09-06T18:55:02.383 に答える
4

ICS以上...

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

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

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

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

于 2014-01-24T07:29:53.503 に答える