Android BlurMaskFilter no tiene efecto en canvas.drawOval mientras el texto está borroso

4 minutos de lectura

Android BlurMaskFilter no tiene efecto en canvasdrawOval mientras el
fasih.rana

He estado tratando de crear una vista personalizada que tiene formas borrosas debajo del texto. El problema es que BlurMaskFilter no tiene efecto en ninguna forma que dibujo en el lienzo. Así es como estoy inicializando los objetos Paint en el constructor:

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

Y estoy llamando a funciones como esta en onDraw():

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

Pero esto es lo que veo.

El óvalo no está borroso pero el texto está borroso.

Usando Android 4.0 SDK y probando en un dispositivo Galaxy Nexus 4.0.4 (Reino Unido). Me pregunto si esto es un error en 4.0.4, ya que lo probé en el emulador con 4.0 y 4.0.3 y se desdibujó perfectamente en ellos, a menos que esté haciendo algo completamente mal.

EDITAR: aquí está el código de vista extendido para probarlo en otras plataformas.

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

}

  • Estoy viendo lo mismo en un Galaxy Nexus con 4.0.4, solo el texto está borroso, nada más. Ejecutar la misma aplicación de prueba en mi Gingerbread Incredible desenfoca correctamente todas las formas y el texto.

    – José

    06 jul.

1641756524 725 Android BlurMaskFilter no tiene efecto en canvasdrawOval mientras el
chispeante

Me parece un error. Lo informé al equipo de Android; vamos a ver que dicen.

Se representa correctamente si configura android:hardwareAccelerated="false" sobre su actividad en AndroidManifest.xml.

Aquí está la palabra oficial del equipo de gráficos de Android: “BlurMaskFilter no es compatible con la aceleración de hardware”. (Al 10 de julio de 2012)

  • Sí, se procesa correctamente si la aceleración de hardware se establece en falso. Pero desafortunadamente no puedo hacer eso ya que la aplicación usa aceleración de hardware. Gracias por tu respuesta.

    – fasih.rana

    11 jul.


  • Creo que es razonable utilizar principalmente la representación de hardware, pero forzar la representación de software en actividades específicas que tengan problemas, siempre que el rendimiento sea bueno.

    – chispeante

    11 jul.

  • Puede deshabilitar la aceleración HW en el nivel de VISTA: myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

    – Zsolt Safrany

    14 dic. 12 a las 15:10

  • @chester1000 No está en la lista pública de errores, lo siento. Pero Romain Guy proporcionó la respuesta, directamente en respuesta a este tema de SO.

    – chispeante

    11 ene.

  • A partir de 2015, esto me solucionó el problema.

    – locrizak

    18 mayo 2015 en 04:21

Si no puede deshabilitar la aceleración de hardware en su actividad (por ejemplo, usa TextureView que requiere aceleración de hardware), puede llamar establecerTipoDeCapa con primer parámetro CAPA_TIPO_SOFTWARE y el segundo parámetro nulo para su vista.

Como esto

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

Más información sobre filtros de máscara, efectos y shaders que puedes encontrar aquí.

Tuve el mismo problema al agregar un filtro a una ruta. Noté que establecer el objetivo en 13 o menos permite que los filtros funcionen. 14 y más no lo hicieron.

android:targetSdkVersion="13" 

  • Lo cual es extraño considerando que la aceleración de hardware se introdujo en API 11.

    – fasih.rana

    22 mayo 2013 en 10:44

  • Aún más extraño, cuando mezclé la vista con un mapa de bits, el nuevo mapa de bits lo mostró con el desenfoque en la copia. Realmente extraño

    – a54studio

    22 mayo 2013 en 11:53

  • Entonces, ¿hay alguna alternativa sobre cómo lograr este efecto de desenfoque sin el filtro de máscara de desenfoque? Poner el renderizado hw en OFF realmente ralentiza las animaciones.

    – Udayaditya Barua

    06 nov.

  • No que yo sepa realmente.

    – a54studio

    08 nov.

  • Este es un comportamiento normal, ya que la aceleración de hardware solo se activa de forma predeterminada desde el nivel de API 14 y superior. Mira aquí: desarrollador.android.com/guide/topics/graphics/hardware-accel.html

    – A. Steenbergen

    16 mar. 14 a las 0:52


.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad