Android BlurMaskFilter non ha effetto su canvas.drawOval quando il testo è sfocato

Ho cercato di creare una visualizzazione personalizzata con forms sfocate sotto il testo. Il problema è che BlurMaskFilter non ha alcun effetto su alcuna forma disegnata sulla canvas. Ecco come sto inizializzando gli oggetti Paint nel costruttore:

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)); 

E sto chiamando le funzioni come questo in onDraw ():

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

Ma questo è quello che vedo.

L'ovale non è sfocato ma il testo è sfocato.

Utilizzo di sdk Android 4.0 e test su un dispositivo galaxy nexus 4.0.4 (Regno Unito). Mi chiedo se questo è un bug in 4.0.4 come l’ho provato sull’emulatore con 4.0 e 4.0.3 e si è sfocato perfettamente bene su di loro, a meno che non stia facendo qualcosa di completamente sbagliato?

EDIT: Ecco il codice esteso View per testarlo su altre piattaforms.

 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); } } 

Solutions Collecting From Web of "Android BlurMaskFilter non ha effetto su canvas.drawOval quando il testo è sfocato"

Sembra un insetto per me. L’ho segnalato al team di Android; vedremo cosa dicono.

Rende correttamente se si imposta android:hardwareAccelerated="false" sulla propria attività in AndroidManifest.xml .

Ecco la parola ufficiale del team di grafica Android: “BlurMaskFilter non è supportato con l’accelerazione hardware”. (A partire dal 10 luglio 2012)

Ho avuto lo stesso problema durante l’aggiunta di un filtro a un percorso. Ho notato che l’impostazione del target su 13 o inferiore consente ai filtri di funzionare. 14 e su non hanno fatto.

 android:targetSdkVersion="13" 

Se non è ansible disabilitare l’accelerazione hardware nella propria attività (ad esempio utilizza TextureView che richiede l’accelerazione hardware), è ansible chiamare setLayerType con il primo parametro LAYER_TYPE_SOFTWARE e il secondo parametro null per la visualizzazione.

Come questo

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

Ulteriori informazioni sui filtri maschera, gli effetti e gli shader che puoi trovare qui .