В настоящее время я работаю с GridView, содержащим ImageViews, и хотел бы тени позади моих изображений. Скажем, в сетке в любой момент можно увидеть 15 изображений. Работая в предположении, что я хочу, чтобы мой экран отображался со скоростью 50 кадров в секунду, чтобы он выглядел гладким, моя математика показывает, что я хочу, чтобы общее время рисования каждого ImageView было не хуже, чем около 1,3 мс.
Я взглянул на то, как Ромен Гай делал тени в своем приложении «Полки»:
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);
}
}
(Очевидно, это просто дает мне черные прямоугольники с тенями, но этого было достаточно для первоначального предположения о производительности.)
Прокрутка сетки была довольно изменчивой, поэтому я проверил время прорисовки, которое получал в Hierarchy Viewer: ~ 3,5 мс на ImageView. В лучшем случае получается около 19 кадров в секунду.
Однако, если я удаляю оператор setShadowLayer (), средство просмотра иерархии показывает время прорисовки около 0,2 мс для каждого ImageView.
Если я забуду все о drawRect () и вместо этого создам патч из девяти участков с теневыми краями, вызвав setBackgroundResource (R.drawable.my_nine_patch) в onDraw (), я увижу время рисования около 1,5 мс для ImageView.
Известны ли проблемы с производительностью при использовании Paint с shadowLayer? Я делаю что-то глупое в приведенном выше коде?