現在、ImageViews を含む GridView を使用しており、画像の背後に影を付けたいと考えています。グリッドには、いつでも 15 枚の画像が表示される可能性があります。画面を 50 fps でレンダリングして滑らかに表示するという仮定の下で作業すると、計算によると、各 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.5ms です。これは、せいぜい約19fpsになります。
ただし、setShadowLayer() ステートメントを削除すると、Hierarchy Viewer は ImageView あたり約 0.2 ミリ秒の描画時間を示します。
drawRect() のことをすべて忘れて、代わりに onDraw() で setBackgroundResource(R.drawable.my_nine_patch) を呼び出してシャドウ エッジを持つ 9 パッチを作成すると、ImageView あたり約 1.5 ミリ秒の描画時間が表示されます。
shadowLayer で Paint を使用する際の既知のパフォーマンスの問題はありますか? 上記のコードで何かばかげたことをしていますか?