6

そのため、現在行っている描画 (アルファ透明度を使用して円弧の一部を描画) を高速化しようとしており、円弧全体を別のビットマップにキャッシュし、アルファ マスクで選択的に表示しようとしていました。

私が行った調査 (Android 用の Xfermodes API デモ、この例、およびこのツール) から、たとえば次の 2 つのグラフィックがある場合:

ここに画像の説明を入力

ここに画像の説明を入力

次を使用して描画します。

Xfermode DST_IN = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

canvas.drawBitmap(circle, 0, 0, paint);
paint.setXfermode(DST_IN);
canvas.drawBitmap(arc, 0, 0, paint);
paint.setXfermode(null);

この結果が得られるはずです:

ここに画像の説明を入力

宛先イメージ (円) が、ソース イメージ (円弧) が描画される領域にクリップされる場所。代わりに、完全な円を取得します。円弧を描くだけでは正しい位置に表示され、代わりに DST_OUT を使用すると、期待される結果 (円の他の 3 つの象限) の逆になります。

また、この Xfermode で問題が発生した場合に備えて、このビューのハードウェア レンダリングを無効にしましたが、違いはありません。

最も単純なレベルで別のプロジェクトに分割して動作させようとしましたが、次のコードを使用しても同じ問題が発生します。

public class ClippedView extends View {
    private Xfermode DST_IN, DST_OUT;
    private Paint paint;

    public ClippedView(Context context) {
        super(context);
        init();
    }

    private void init() {
        setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        DST_IN = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
        DST_OUT = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.GREEN);
        canvas.drawRect(0, 0, getWidth() / 2, getHeight() / 2, paint);
        paint.setColor(Color.BLACK);
        paint.setXfermode(DST_IN);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, paint);
        paint.setXfermode(null);
    }
}

私はそれを間違って使用していますか?何か足りないだけですか?バグを見つけましたか?:)

4

1 に答える 1

9

これを実現するためのはるかに安価で簡単な方法があります: クリッピングを使用します。Canvas.clipRect() で十分です。あなたのソリューションは、多くのフィルレートを燃やしています。DST_IN の代わりに SRC_IN を使用すると、必要な効果を得ることができます。ただし注意してください。透明なビットマップまたはレイヤーでのみ機能します。画面に直接描画すると、宛先はウィンドウの背景で既に塗りつぶされています。

于 2012-12-01T00:44:16.203 に答える