Подтвердить что ты не робот

Android BlurMaskFilter не влияет на canvas.drawOval, в то время как текст размыт

Я пытаюсь создать пользовательский вид, который имеет размытые фигуры под текстом. Проблема в том, что 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.0x галактики nexus (Великобритания). Мне интересно, если это ошибка в 4.0.4, так как я тестировал ее на эмуляторе с 4.0 и 4.0.3, и он отлично смахивал на них, если я не делаю что-то совершенно неправильное?

EDIT: Вот расширенный код просмотра, чтобы протестировать его на других платформах.

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

}
4b9b3361

Ответ 1

Похож на ошибку. Я сообщил об этом команде Android; мы увидим, что они говорят.

Он корректно отображает, если вы установили android:hardwareAccelerated="false" в свою активность в AndroidManifest.xml.

Вот официальное слово команды графики Android: "BlurMaskFilter не поддерживается аппаратным ускорением". (По состоянию на 10 июля 2012 года)

Ответ 2

У меня была такая же проблема, добавляя фильтр к пути. Я заметил, что установка цели на 13 или ниже позволяет фильтрам работать. 14, и они этого не сделали.

android:targetSdkVersion="13" 

Ответ 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...
}

Подробнее о маске фильтры, эффекты и шейдеры вы можете найти здесь.