setShadowLayer причинява бавно време за рисуване в GridView?

В момента работя с GridView, съдържащ ImageViews, и бих искал сенки зад моите изображения. Има потенциално, да речем, 15 изображения, видими в мрежата по всяко време. Работейки при предположението, че искам екранът ми да се изобразява при 50 кадъра в секунда, за да изглежда гладко, моята математика показва, че искам общото време за рисуване на всеки ImageView да не е по-лошо от около 1,3 ms.

Разгледах как Ромен Гай правеше сенки в своето приложение 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);
     }
 }

(Очевидно това просто ми дава черни правоъгълници със сенки, но беше достатъчно, за да получа първоначално предположение за производителността.)

Превъртането през решетката беше доста накъсано, така че проверих времето за теглене, което получавах в Hierarchy Viewer: ~3,5 ms на ImageView. Това в най-добрия случай излиза около 19 кадъра в секунда.

Ако обаче премахна оператора setShadowLayer(), Hierarchy Viewer показва времена на теглене около 0,2 ms за ImageView.

Ако забравя всичко за drawRect() и вместо това създам девет пластира със сенки, извиквайки setBackgroundResource(R.drawable.my_nine_patch) в onDraw(), виждам времена за изтегляне около 1,5 ms на ImageView.

Има ли известни проблеми с производителността при използване на Paint със shadowLayer? Правя ли нещо глупаво в горния код?


person jordanti    schedule 23.09.2011    source източник