web-dev-qa-db-ja.com

Android BlurMaskFilterは、テキストがぼかされている間、canvas.drawOvalに影響しません

テキストの下にぼやけた形のカスタムビューを作成しようとしています。問題は、BlurMaskFilterが、キャンバスに描画するどのシェイプにも影響を与えないことです。コンストラクターでPaintオブジェクトを初期化する方法を次に示します。

Paint = new Paint(0);
Paint.setColor(0xffffffff);
Paint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));

mShadowPaint = new Paint(0);
mShadowPaint.setColor(0xff333333);
mShadowPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));

そして、私はonDraw()で次のような関数を呼び出しています:

canvas.drawOval(mShadowBounds,mShadowPaint);
canvas.drawText("hello", x, y, Paint);

しかし、これは私が見るものです。

The Oval is not blurred yet the text is blurred.

Android 4.0 sdkを使用し、4.0.4ギャラクシーネクサスデバイス(英国)でテストしています。4.0のエミュレータでテストしたので、これは4.0.4のバグかどうか疑問に思っています。そして、4.0.3そして、私が何か間違ったことをしているのでない限り、それはそれらの上で完全によくぼやけましたか?

編集:これは、他のプラットフォームでテストするための拡張Viewコードです。

import Android.content.Context;
import Android.graphics.BlurMaskFilter;
import Android.graphics.Canvas;
import Android.graphics.Paint;
import Android.graphics.RectF;
import Android.util.AttributeSet;
import Android.view.View;

public class BlurTestView extends View{

    private Paint paint;
    private Paint mShadowPaint;
    private int size = 100;
    private RectF mShadowBounds = new RectF();

    public BlurTestView(Context context) {
        this(context, null, 0);
    }

    public BlurTestView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BlurTestView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        Paint = new Paint(0);
        Paint.setColor(0xff333333);
        Paint.setTextSize(size);
        Paint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));

        mShadowPaint = new Paint(0);
        mShadowPaint.setColor(0xff333333);
        mShadowPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));

        mShadowBounds.top = size;
        mShadowBounds.bottom = mShadowBounds.top+(size /2);
        mShadowBounds.left = 0;
        mShadowBounds.right = (int)Paint.measureText("hello");
    }

    @Override
    public void onDraw(Canvas canvas)
    {
        canvas.drawOval(mShadowBounds,mShadowPaint);
        canvas.drawText("hello", 0, size, Paint);
    }

}
25
fasih.rana

私にはバグのようです。私はそれをAndroidチームに報告しました。彼らの言うことがわかります。

Android:hardwareAccelerated="false"のアクティビティでAndroidManifest.xmlを設定すると、正しくレンダリングされます。

Androidグラフィックチームからの公式の単語:「BlurMaskFilterはハードウェアアクセラレーションではサポートされていません。」(2012年7月10日現在)

37
Sparky

アクティビティでハードウェアアクセラレーションを無効にできない場合(たとえば、ハードウェアアクセラレーションを必要とするTextureViewを使用している場合)、最初のパラメーター LAYER_TYPE_SOFTWAREsetLayerType を呼び出し、2番目のパラメーターをnullにするだけです。あなたの意見。

このような

public class BlurTestView extends View {

    public BlurTestView(Context context) {
        this(context, null, 0);
    }

    public BlurTestView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BlurTestView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        // Disable hardware acceleration for this view
        setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

        // Perform other initialisation 
    }

    // Other methods and so on...
}

マスクフィルター、エフェクト、シェーダーの詳細については、 ここ を参照してください。

4
Sergey Pekar

パスにフィルターを追加しているときにも同じ問題が発生しました。ターゲットを13以下に設定すると、フィルターが機能することに気づきました。 14歳以上はそうではありませんでした。

Android:targetSdkVersion="13" 
1
a54studio