2012-07-01 8 views
24

テキストの下にぼやけた図形を持つカスタムビューを作成しようとしています。問題は、BlurMaskFilterがキャンバスに描画する図形に何の影響も与えないことです。ここで私はコンストラクタでペイントオブジェクトを初期化しています方法です:テキストがぼやけている間に、Android BlurMaskFilterはcanvas.drawOvalに何の効果もありません。

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.

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

EDIT:他のプラットフォームでテストするための拡張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); 
    } 

} 
+2

Galaxy Nexus 4.0.4で同じことが起こっていますが、テキストだけがぼやけているだけです。私のGingerbread Incredibleで同じテストアプリケーションを実行すると、すべての図形とテキストが適切にぼかされます。 – Josh

答えて

36

私にバグのようです。私はそれをAndroidチームに報告しました。私たちは彼らの言うことを見るでしょう。

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

"BlurMaskFilterはハードウェアアクセラレーションではサポートされていません。" (2012年7月10日現在)

+0

はい、ハードウェアアクセラレーションがfalseに設定されていると正しくレンダリングされます。しかし残念ながら、アプリケーションがハードウェアアクセラレーションを使用するので、残念ながらそれを行うことはできません。しかし、あなたの返信をありがとう。 –

+0

ほとんどの場合、ハードウェアレンダリングを使用するのが妥当だと思いますが、パフォーマンスが良好であれば、問題のある特定のアクティビティにソフトウェアレンダリングを強制します。 – Sparky

+0

私はそれを試みましたが、パフォーマンスはかなり悪化しました。 –

1

パスにフィルタを追加する際に同じ問題が発生しました。ターゲットを13以下に設定すると、フィルタが機能するようになりました。 14歳以上はそうしなかった。

android:targetSdkVersion="13" 
+0

API 11でハードウェアアクセラレーションが導入されたことが奇妙です。 –

+0

見知らぬ人でも、ビューをビットマップにミキシングすると、新しいビットマップにコピーのぼかしが表示されます。本当に奇妙です。 – a54studio

+1

blurmaskfilterなしでこのぼかし効果をどのように達成するかについての選択肢はありますか? hwレンダリングをOFFに設定すると、実際にはアニメーションが遅くなります。 – Uday

1

あなたの活動のハードウェアアクセラレーションを無効にすることはできません場合は、あなただけの最初のパラメータLAYER_TYPE_SOFTWAREとあなたのビューのための2番目のパラメータはnullでsetLayerTypeを呼び出すことができます(たとえば、ハードウェアアクセラレーションを必要とTextureViewを使用しています)。あなたがhere見つけることができるマスクフィルタ、エフェクト、シェーダーについては、この

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... 
} 

詳細情報と同様に

関連する問題