2012-07-01 1 views
24

Я пытаюсь создать пользовательский вид, который имеет размытые формы под текстом. Проблема в том, что BlurMaskFilter не влияет на любую фигуру, которую я рисую на холсте. Вот как я инициализация объектов рисования в конструкторе:Android BlurMaskFilter не влияет на canvas.drawOval, в то время как текст размыт.

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 галактики (Великобритания). Мне интересно, является ли это ошибкой в ​​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); 
    } 

} 
+2

Я вижу то же самое на Galaxy Nexus, работающем 4.0.4, только текст размыт, ничего больше. Запуск того же тестового приложения на моем Gingerbread Incredible правильно стирает все фигуры и текст. – Josh

ответ

36

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

Он корректно отображает, если вы задали android:hardwareAccelerated="false" о вашей деятельности в: AndroidManifest.xml.

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

+0

Да, это правильно отображается, если для аппаратного ускорения установлено значение false. Но, к сожалению, я не могу этого сделать, поскольку приложение использует аппаратное ускорение. Спасибо за ваш ответ. –

+0

Я думаю, что разумно использовать главным образом аппаратное рендеринг, но принудительно выполнять рендеринг программного обеспечения для конкретных видов деятельности, которые имеют проблемы, если производительность хорошая. – Sparky

+0

Я пробовал это, производительность значительно ухудшилась. –

1

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

android:targetSdkVersion="13" 
+0

Что странно, учитывая аппаратное ускорение, было введено в API 11. –

+0

Даже незнакомец, когда я смешал представление вниз с растровым изображением, новое растровое изображение показало его с размытием в копии. Действительно странно. – a54studio

+1

Итак, есть ли альтернатива тому, как достичь этого эффекта размытия без фильтра blurmaskfilter? Настройка рендеринга hw действительно замедляет анимацию. – Uday

1

Если вы не можете отключить аппаратное ускорение в вашей деятельности (например, он использует 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.

 Смежные вопросы

  • Нет связанных вопросов^_^