【问题标题】:Android BlurMaskFilter has no effect in canvas.drawOval while text is blurred文本模糊时,Android BlurMaskFilter 在 canvas.drawOval 中没有效果
【发布时间】:2012-07-01 11:02:29
【问题描述】:

我一直在尝试创建一个自定义视图,该视图在文本下具有模糊的形状。问题是 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);

但这就是我看到的。

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

编辑:这是在其他平台上测试它的扩展视图代码。

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

}

【问题讨论】:

  • 我在运行 4.0.4 的 Galaxy Nexus 上看到了同样的情况,只有文字模糊,没有别的。在我的 Gingerbread Incredible 上运行相同的测试应用程序会正确地模糊所有形状和文本。

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


【解决方案1】:

对我来说似乎是一个错误。我向 Android 团队报告;我们会看看他们怎么说。

如果您在AndroidManifest.xml 的Activity 上设置android:hardwareAccelerated="false",它会正确呈现。

这是来自 Android 图形团队的官方说法: “硬件加速不支持 BlurMaskFilter。” (截至 2012 年 7 月 10 日)

【讨论】:

  • 是的,如果硬件加速设置为 false,它会正确呈现。但不幸的是我不能这样做,因为应用程序使用硬件加速。不过还是谢谢你的回复。
  • 我认为主要使用硬件渲染但在有问题的特定Activity上强制软件渲染是合理的,只要性能好。
  • 可以在VIEW级别禁用硬件加速:myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
  • @chester1000 它不在公共错误列表中,抱歉。但是 Romain Guy 直接针对这个 SO 主题提供了答案。
  • 截至 2015 年,这解决了我的问题。
【解决方案2】:

如果您无法在活动中禁用硬件加速(例如,它使用需要硬件加速的 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

【讨论】:

    【解决方案3】:

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

    android:targetSdkVersion="13" 
    

    【讨论】:

    • 考虑到 API 11 中引入了硬件加速,这很奇怪。
    • 更奇怪的是,当我将视图混合为位图时,新位图会显示副本中的模糊部分。真的很奇怪。
    • 那么在没有 blurmaskfilter 的情况下如何实现这种模糊效果有什么替代方法吗?将硬件渲染设置为 OFF 确实会减慢动画速度。
    • 我真的不知道。
    • 这是正常行为,因为硬件加速仅在 API 级别 14 及更高级别默认开启。见这里:developer.android.com/guide/topics/graphics/hardware-accel.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多