7

の角をトリミングする必要がありImageViewます。それらを丸めるのではなく、各コーナーから三角形を消去します。

これを行う唯一の方法は、メソッドをオーバーライドし、onDrawを使用してキャンバスからこれらの領域を消去することPathです。問題は、無地の背景がないため、これらの領域を消去する必要がありますが、色で塗りつぶす必要はありません。

そのために次のコードを使用します。

@Override
protected void onDraw(Canvas canvas) {
    Path path = new Path();
    path.moveTo(0, 0);
    path.lineTo(20, 0);
    path.lineTo(0, 20);
    path.close();

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.drawPath(path, paint);
    super.onDraw(canvas);
}

ただし、角は黒くなりますが、透明にはなりません。私たちを手伝ってくれますか?または、おそらくあなたは私の仕事のためのより良い解決策を知っています. これがどのように見えるかです。

ここに画像の説明を入力

4

3 に答える 3

5

透明色で描画するにはPaint setXfermode、キャンバスにビットマップを設定した場合にのみ機能する透明色を使用する必要があります。以下の手順に従うと、目的の結果が得られるはずです。

  1. キャンバスを作成し、そのビットマップを設定します。

    mCanvas = new Canvas();
    mBitmap= Bitmap.createBitmap(scrw, scrh, Config.ARGB_8888);
    mCanvas.setBitmap(mBitmap);
    
  2. 何かを消去したい場合は、setXfermode を使用するだけです。

    if (isErasing)
       mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    else
       mPaint.setXfermode(null);
    
  3. これで、次を使用して透明色で描画できるはずです。

    mCanvas.drawPath(yourpath, mPaint);

于 2014-03-06T22:09:59.027 に答える
2

キャンバスオブジェクトをクリップできます。

@Override
protected void onDraw(Canvas canvas) {
    final Path path = new Path();
    final int count = canvas.save();

    path.moveTo(0, 20);
    path.lineTo(20, 0);
    path.lineTo(getWidth(), 0);
    path.lineTo(getWidth(), getHeight());
    path.lineTo(0, getHeight());
    path.close();

    canvas.clipPath(path);
    super.onDraw(canvas);
    canvas.restoreToCount(count);
}

Canvas.clipPathハードウェアアクセラレーションが有効になっているAndroid3.0以降では動作しないことに注意してください。

于 2013-01-15T08:58:24.647 に答える
-1

この回線を使用

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

これの代わりに

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
于 2013-01-15T08:16:26.177 に答える