我目前正在使用包含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是否存在已知的性能问题?我在上面的代码中做了些蠢事吗?