2012-07-01 12 views
24

Ho cercato di creare una vista personalizzata con forme sfocate sotto al testo. Il problema è che BlurMaskFilter non ha alcun effetto su alcuna forma disegnata sulla tela. Ecco come sto inizializzazione degli oggetti di vernice nel costruttore:Android BlurMaskFilter non ha effetto su canvas.drawOval quando il testo è sfocato

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 di questo tipo in OnDraw():

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

Ma questo è quello che vedo.

The Oval is not blurred yet the text is blurred.

con Android 4.0 SDK e test su un dispositivo Nexus 4.0.4 galaxy (UK). 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?

MODIFICA: questo è il codice di visualizzazione esteso per testarlo su altre piattaforme.

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

Sto vedendo la stessa cosa su un Galaxy Nexus con 4.0.4, solo il testo è sfocato, nient'altro. L'esecuzione della stessa app di test sul mio Gingerbread Incredible offusca correttamente tutte le forme e il testo. – Josh

risposta

36

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

Viene visualizzato correttamente se si imposta android:hardwareAccelerated="false" sull'attività in AndroidManifest.xml.

Ecco la parola ufficiale del team di grafica Android: "BlurMaskFilter non è supportato con l'accelerazione hardware". (10 luglio 2012)

+0

Sì esegue correttamente il rendering se l'accelerazione hardware è impostata su false. Ma sfortunatamente non posso farlo poiché l'applicazione utilizza l'accelerazione hardware. Grazie per la tua risposta però. –

+0

Penso che sia ragionevole utilizzare principalmente il rendering dell'hardware ma forzare il rendering del software su attività specifiche che presentano problemi, a patto che le prestazioni siano buone. – Sparky

+0

L'ho provato, le prestazioni sono notevolmente peggiorate. –

1

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" 
+0

Che è strano considerando che l'accelerazione hardware è stata introdotta nell'API 11. –

+0

Anche estraneo, quando ho mescolato la vista in una bitmap, la nuova bitmap lo ha mostrato con la sfocatura nella copia. Davvero strano – a54studio

+1

Quindi c'è qualche alternativa su come ottenere questo effetto sfocatura senza blurmasfilter? L'impostazione dell'hw rendering OFF rallenta davvero le animazioni. – Uday

1

Se non è possibile disabilitare l'accelerazione hardware nella vostra attività (ad esempio utilizza TextureView che richiedono l'accelerazione hardware) si può chiamare setLayerType con primo parametro LAYER_TYPE_SOFTWARE e il secondo parametro zero per la visualizzazione.

Ti piace questa

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

Maggiori informazioni su maschera filtri, effetti e shader si possono trovare here.

Problemi correlati