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