Android BlurMaskFilter在canvas.drawOval中没有效果,而文本模糊

时间:2012-07-01 11:02:29

标签: android android-canvas android-4.0-ice-cream-sandwich blur

我一直在尝试创建一个在文本下模糊形状的自定义视图。问题是BlurMaskFilter对我在画布上绘制的任何形状都没有影响。以下是我在构造函数中初始化Paint对象的方法:

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.

使用android 4.0 sdk并在4.0.4 galaxy nexus设备(英国)上进行测试。我想知道这是否是4.0.4中的一个错误,因为我在4.0和4.0.3模拟器上测试它并且它确实很好地模糊了它们,除非我做错了什么?

编辑:这是在其他平台上测试它的扩展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);
    }

}

3 个答案:

答案 0 :(得分:37)

对我来说看起来像个错误。我向Android团队报告过;我们会看到他们说的话。

如果您在android:hardwareAccelerated="false"的活动中设置AndroidManifest.xml,则会正确呈现。

以下是Android图形团队的官方消息: “硬件加速不支持BlurMaskFilter。” (截至2012年7月10日)

答案 1 :(得分:3)

如果您无法在活动中禁用硬件加速(例如,它使用需要硬件加速的TextureView),您只需使用第一个参数setLayerType调用LAYER_TYPE_SOFTWARE,为视图调用第二个参数null。

喜欢这个

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

有关遮罩过滤器,效果和着色器的更多信息,您可以找到here

答案 2 :(得分:1)

向路径添加过滤器时遇到了同样的问题。我注意到将目标设置为13或更低允许过滤器工作。 14岁以上他们没有。

android:targetSdkVersion="13"