当文本模糊时,Android BlurMaskFilter在canvas.drawOval中无效

我一直在试图创build一个自定义的视图,在文字下模糊的形状。 问题是BlurMaskFilter对我在canvas上绘制的任何形状没有影响。 以下是我如何初始化构造函数中的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设备(英国)上testing。 我想知道这是否是4.0.4中的一个错误,因为我在4.0和4.0.3的模拟器上testing过它,除非我做了完全错误的事情,否则它们对它们的模糊程度非常好。

编辑:这是扩展视图代码来testing它在其他平台上。

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

Solutions Collecting From Web of "当文本模糊时,Android BlurMaskFilter在canvas.drawOval中无效"

看起来像是一个bug。 我把它报告给了Android团队。 我们会看到他们说什么

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

这里是Androidgraphics团队的官方文字:“BlurMaskFilter不支持硬件加速”。 (截至2012年7月10日)

添加filter到path时,我有同样的问题。 我注意到,将目标设置为13或更低可以使filter工作。 14而他们没有。

 android:targetSdkVersion="13" 

如果您不能在您的活动中禁用硬件加速(例如,它使用需要硬件加速的TextureView),则可以使用第一个参数LAYER_TYPE_SOFTWARE调用setLayerType ,并为视图调用第二个参数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... } 

有关遮罩filter,效果和着色器的更多信息,请点击这里 。