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

Android Paint.setShadowLayer() vs Canvas.drawbitmap() проблемы

Я использую следующий код для рисования растрового изображения во время onDraw пользовательского представления

Paint p = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
p.setShadowLayer(3,3,3,0xff000000);
Bitmap bmp = BitmapFactory.decodeResource(some drawable jpg);
canvas.drawBitmap(bmp,null,new Rect(blah blah),p);

и тень выглядит смешно. Что я имею в виду? Я имею в виду, что я получаю другую тень, если я вызываю canvas.drawRect(). Он выглядит примерно так, как теневой код андроида обрабатывает растровое изображение как альфа-канал или что-то в этом роде.

попытались добавить p.setColor(0xff000000); и p.setStyle(Paint.Style.FILL); но не разница.

Наверное, я мог бы нарисоватьRect с тенью, а затем drawBitmap с теневым отключением, но это кажется глупым, поскольку это будет рендеринг пикселей в два раза.

4b9b3361

Ответ 1

В основном теневой слой не работает ни для чего, кроме текста. Это действительно глупо. Проверьте диаграмму операций, поддерживающих аппаратное ускорение Android.

Этот вопрос был задан еще в 2010 году, когда аппаратные ускоренные деревья просмотра не существовали. Основываясь на вещах, которые я читал, даже тогда теневой слой работал только на простые фигуры (если вообще), а другие получили странные результаты используя его ни на чем, кроме текста. Возможно, вам не повезло.

Наконец, есть много способов подделать теневой слой. Вы можете обернуть представление в другое представление и нарисовать под ним. Вы можете написать представление, которое рисует тень как радиальный градиент и т.д. Но вы, вероятно, просто хотите сделать 9patch, который выглядит как тень и использовать его.

Ответ 3

Возможно, у вас должны быть разные объекты Paint для разных целей, таких как текст, растровое изображение и т.д. Таким образом, один параметр не влияет на других.