Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
470 views
in Technique[技术] by (71.8m points)

android - setShadowLayer causes slow draw time in GridView?

I'm currently working with a GridView containing ImageViews and would like shadows behind my images. There are potentially, say, 15 images visible in the grid at any time. Working under the assumption that I want my screen to render at 50fps to appear smooth, my math shows that I want the total draw time of each ImageView to be no worse than around 1.3ms.

I took a look at how Romain Guy was doing shadows in his Shelves app: http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/util/ImageUtilities.java

That seemed to make sense, so I created the following class:

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

(Obviously this just gives me black rectangles with shadows, but was enough for getting an initial guess on performance.)

Scrolling through the grid was pretty choppy, so I checked the draw times I was getting in Hierarchy Viewer: ~3.5ms per ImageView. This comes out to around 19fps at best.

If I remove the setShadowLayer() statement, however, Hierarchy Viewer shows draw times around 0.2ms per ImageView.

If I forget all about drawRect() and instead create a nine-patch with shadow edges, calling setBackgroundResource(R.drawable.my_nine_patch) in onDraw(), I see draw times around 1.5ms per ImageView.

Are there known performance issues using Paint with a shadowLayer? Am I doing something silly in the above code?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...