1

内部に単一のビューを表示するカスタム ViewGroup を実装したいと思います。トリッキーな部分は、子ビューを円形にトリミングする必要があり、高速に描画する必要があることです。

この動作を実装する最良の方法は何ですか?

私の現在の実装は次のようになります。

@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
    child.setDrawingCacheEnabled(true);
    child.buildDrawingCache();
    child.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    canvas.drawBitmap(getCroppedBitmap(child.getDrawingCache()), outerWidth, outerWidth, new Paint());
    child.setLayerType(View.LAYER_TYPE_NONE, null);
    return true;
}

public Bitmap getCroppedBitmap(Bitmap bitmap) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
            bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    childPaint.setXfermode(null);
    canvas.drawARGB(0, 0, 0, 0);
    canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
            bitmap.getWidth() / 2, childPaint);
    childPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, mBoundsI, mBoundsI, childPaint);
    return output;
}

(新しいキャンバスとビットマップが作成され、描画キャッシュが有効になるたびに)

4

1 に答える 1

0

おそらく、これを達成する最も速い方法は、ビューをキャンバスに直接描画させることです (バッファーとビットマップの作成を回避します)。

そのためには、キャンバス上でクリップ パスを指定し、Path を適切な circleに設定する必要があります。

次に、キャンバスは、クリッピングパスの外側に描画されるものは何も描画しません

ps .:での後続の呼び出しでは、適切なREPLACE リージョンを使用することを忘れないでください。clipPath

于 2014-06-04T14:25:03.353 に答える