В настоящее время я работаю с GridView, содержащим ImageView, и мне нужны тени за моими изображениями. Потенциально, скажем, 15 изображений видны в сетке в любой момент времени. Исходя из предположения, что я хочу, чтобы мой экран отображался со скоростью 50 кадров в секунду, чтобы он выглядел плавно, моя математика показывает, что я хочу, чтобы общее время прорисовки каждого ImageView было не хуже, чем около 1,3 мс.
Я посмотрел, как Ромен Гай рисовал тени в своем приложении Shelves: http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android./shelves/util/ImageUtilities.java
Это казалось логичным, поэтому я создал следующий класс:
public class ShadowImageView extends ImageView {
private static final int SHADOW_RADIUS = 8;
private static final int SHADOW_COLOR = 0x99000000;
private static final Paint SHADOW_PAINT = new Paint();
static {
SHADOW_PAINT.setShadowLayer(SHADOW_RADIUS / 2.0f, 0.0f,
0.0f, SHADOW_COLOR);
SHADOW_PAINT.setColor(0xFF000000);
SHADOW_PAINT.setStyle(Paint.Style.FILL);
}
public ShadowImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onDraw(Canvas canvas) {
final int containerWidth = getMeasuredWidth();
final int containerHeight = getMeasuredHeight();
canvas.drawRect(
SHADOW_RADIUS / 2.0f,
SHADOW_RADIUS / 2.0f,
containerWidth - SHADOW_RADIUS / 2.0f,
containerHeight - SHADOW_RADIUS / 2.0f,
SHADOW_PAINT);
}
}
(Очевидно, что это просто дает мне черные прямоугольники с тенями, но этого было достаточно, чтобы получить первоначальное представление о производительности.)
Прокрутка сетки была довольно прерывистой, поэтому я проверил время прорисовки в средстве просмотра иерархии: ~3,5 мс на ImageView. В лучшем случае это около 19 кадров в секунду.
Однако если я удалю оператор setShadowLayer(), средство просмотра иерархии покажет время прорисовки около 0,2 мс на ImageView.
Если я забуду про drawRect() и вместо этого создам девять патчей с теневыми краями, вызвав setBackgroundResource(R.drawable.my_nine_patch) в onDraw(), я увижу, что время отрисовки составляет около 1,5 мс на ImageView.
Известны ли проблемы с производительностью при использовании Paint с теневым слоем? Я делаю что-то глупое в приведенном выше коде?