framework - drawing android studio
Android BlurMaskFilter no tiene efecto en canvas.drawOval mientras el texto está borroso (3)
Parece un error para mí. Lo reporté al equipo de Android; Ya veremos lo que dicen.
Se procesa correctamente si configura android:hardwareAccelerated="false"
en su Actividad en AndroidManifest.xml
.
Esta es la palabra oficial del equipo de gráficos de Android: "BlurMaskFilter no es compatible con la aceleración de hardware". (A partir del 10 de julio de 2012)
He estado tratando de crear una vista personalizada que tiene formas borrosas en el texto. El problema es que BlurMaskFilter no tiene ningún efecto en ninguna forma que dibuje 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 las funciones como esta en onDraw ():
canvas.drawOval(mShadowBounds,mShadowPaint);
canvas.drawText("hello", x, y, paint);
Pero esto es lo que veo.
Uso de Android 4.0 sdk y pruebas en un dispositivo galaxy nexus 4.0.4 (Reino Unido). Me pregunto si se trata de un error en 4.0.4, ya que lo probé en el emulador con 4.0 y 4.0.3 y los empañé perfectamente, 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);
}
}
Si no puede deshabilitar la aceleración de hardware en su actividad (por ejemplo, utiliza TextureView que requiere aceleración de hardware), puede llamar a setLayerType con el primer parámetro LAYER_TYPE_SOFTWARE y el segundo parámetro nulo para su vista.
Me gusta 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 sombreadores se puede encontrar here .
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"