6

我目前正在使用包含 ImageViews 的 GridView 并希望在我的图像后面有阴影。例如,网格中随时可能有 15 张图像可见。假设我希望我的屏幕以 50fps 的速度渲染以显得平滑,我的数学表明我希望每个 ImageView 的总绘制时间不低于 1.3 毫秒左右。

我看看 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);
     }
 }

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

滚动网格非常不稳定,所以我检查了在 Hierarchy Viewer 中获得的绘制时间:每个 ImageView 约 3.5 毫秒。这最多可以达到 19fps 左右。

但是,如果我删除 setShadowLayer() 语句,层次查看器显示每个 ImageView 的绘制时间约为 0.2 毫秒。

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

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

4

0 回答 0