Android canvas setShadowLayer значительно снижает производительность - PullRequest
3 голосов
/ 06 января 2012

Я пишу приложение Canvas на Android и хочу добавить тени, но я заметил значительное замедление, когда я добавляю их в свой объект рисования.Мой код прост, это выглядит так:

...
Paint paint = new Paint();
paint.setShadowLayer(8.f, 0, 0, 0xff000000); // this line makes terribly slow drawing
canvas.drawRect(left, top, right, bottom, paint);

Как я могу сделать это быстрее?

Ответы [ 3 ]

2 голосов
/ 10 февраля 2016

Используя этот код, вы можете достичь почти того же результата:

mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.OUTER));

2 голосов
/ 18 октября 2017

Пока копаясь, чтобы найти способ ускорить мои большие тени от текста, я наткнулся на этот вопрос и ответ:

различия API setShadowLayer для Android

Используя:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

Я резко ускорил все текстовые тени в своем приложении.

Вот пример того, как я его использую:

/**
 * Set a backlight (shadow) on the passed TextView.
 * @param textView
 */
void setBacklight(TextView textView) {
    if (textView != null) {
        float textSize = textView.getTextSize();

        textView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

        textView.setShadowLayer(textSize,0,0,getColor(R.color.color_backlight));
    }
}

Согласно этому документу:

https://developer.android.com/guide/topics/graphics/hardware-accel.html

В нем говорится, что вы можете отключить аппаратное ускорение для представления.

Я не знаю почему, но каким-то образом это волшебным образом ускоряет мои теневые слои TextView.

Я знаю, я знаю. Этот метод не существует для классов Canvas или Paint. Таким образом, чтобы ответить на конкретный вопрос (чтобы меня никто не обижал ...), вы можете установить его в представлении, которое вы намереваетесь нарисовать. Как это:

void inTheShadows(View view) {
    float left = 0f;
    float top = 0f;
    float right = 10f;
    float bottom = 10f;
    Canvas canvas = new Canvas();
    Paint paint = new Paint();

    paint.setShadowLayer(8.f, 0, 0, 0xff000000);

    canvas.drawRect(left, top, right, bottom, paint);

    view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

    view.onDrawForeground(canvas);
}
1 голос
/ 06 января 2012

Используйте значок изображения вместо того, чтобы рисовать его:)

Да, затенение обходится дорого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...