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の機能について説明してください。それは実際に何がクリッピングですか?座標を考慮して、長方形の形でクリップしますか?もしそうなら、なぜ上記のコードが機能しないのですか?
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()
キャンバスの変更前と変更後、描画前。
左上の部分をトリミングするには、次の操作を行います。
canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE);
// secondly...
canvas.drawRect(0,0,100,100, Paint);
ICS以降...
XOR、Difference、ReverseDifferenceのクリップモードは、ハードウェアアクセラレーションが有効になっている場合、ICSによって無視されます。
ビューで2Dハードウェアアクセラレーションを無効にするだけです。
myView.setLayerType(View.LAYER_TYPE_SOFTWARE、null);
リファレンス Android:API15でのclipRectの使用方法
図面は、cliprectを使用しないと次のようになります。
ここで、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の半分を使用したため)。
誰かがそれを角の丸いものにすることができるかどうかを確認したいです。