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

jor*_*nti 6 android android-ui android-listview android-imageview 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);
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

滚动网格非常不稳定,所以我检查了我在层次结构查看器中获得的绘制时间:每个ImageView大约3.5ms.这最多只能达到19fps左右.

但是,如果我删除了setShadowLayer()语句,则层次结构查看器会显示每个ImageView大约0.2ms的绘制时间.

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

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