setShadowLayer会导致GridView中的绘制时间变慢?

时间:2011-09-23 02:22:09

标签: android android-listview android-imageview android-ui android-gridview

我目前正在使用包含ImageViews的GridView,并希望我的图像背后有阴影。例如,在网格中可能有15个图像随时可见。假设我希望我的屏幕以50fps呈现以呈现平滑,我的数学表明我希望每个ImageView的总绘制时间不会差于大约1.3ms。

我看了看Romain Guy如何在他的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);
     }
 }

(显然这只是给我带阴影的黑色矩形,但足以初步猜测性能。)

滚动网格非常不稳定,因此我检查了我在层次结构查看器中获取的绘制时间:每个ImageView约3.5毫秒。这最多只能达到19fps左右。

但是,如果我删除了setShadowLayer()语句,Hierarchy Viewer会显示每个ImageView大约0.2ms的绘制时间。

如果我忘记了所有关于drawRect()的内容,而是创建一个带阴影边的九个补丁,在onDraw()中调用setBackgroundResource(R.drawable.my_nine_patch),我看到每个ImageView的绘制时间大约为1.5ms。

使用带有shadowLayer的Paint是否存在已知的性能问题?我在上面的代码中做了些蠢事吗?

0 个答案:

没有答案