setShadowLayer вызывает медленное время рисования в GridView?

В настоящее время я работаю с 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? Я делаю что-то глупое в приведенном выше коде?

Ответы на вопрос(0)

Ваш ответ на вопрос