今週アンドロイドプログラミングを始めたばかりで、現在ライブ壁紙に取り組んでいます。
背景画像 (720x1280 png) とエンドレス ループで右から左にスライドするスライドバー (2276x290 png) の 2 つの画像があります。私の問題は、フレームあたり1ピクセルで約3〜4fpsでしかスライドできないことです(実際の電話では、AVDでは約1/3fpsになります)。これは、ライブ壁紙を途切れさせる方法です。コードはこれまでのところ正常に動作していますが、遅くなります。
誰かがこれを「はるかに」速くする方法を知っていれば、とてもいいでしょう。
私のコード:
private class WEngine extends Engine {
private final Handler handler = new Handler();
private final Runnable drawRunner = new Runnable() {
@Override
public void run() {
draw();
}
};
private Paint paint = new Paint();
private int width;
int height;
private boolean visible = true;
int x = -1;
int x2 = 0;
int y = -1;
public WEngine() {
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(WService.this);
handler.post(drawRunner);
}
@Override
public void onVisibilityChanged(boolean visible) {
this.visible = visible;
if (visible) {
handler.post(drawRunner);
} else {
handler.removeCallbacks(drawRunner);
}
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
this.visible = false;
handler.removeCallbacks(drawRunner);
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
this.width = width;
this.height = height;
super.onSurfaceChanged(holder, format, width, height);
}
private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
Resources res = getResources();
Bitmap backgroundimg = BitmapFactory.decodeResource(res, R.drawable.background);
Bitmap slidebarimg = BitmapFactory.decodeResource(res, R.drawable.slidebar);
try {
canvas = holder.lockCanvas();
canvas.drawBitmap(backgroundimg, 0, 0, paint);
if (canvas != null) {
if (x<0 && y<0) {
x = 0;
y = Math.round(height / 2);
} else {
x -= 1;
}
if (x - width < -height * 1.778125) {
x2 -= 1;
}
if (x < -height * 1.778125) {
x = x2;
x2 = 0;
}
canvas.drawBitmap(slidebarimg, x, y, paint);
if (x2 < 0) {
canvas.drawBitmap(slidebarimg, x2, y, paint);
}
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
handler.removeCallbacks(drawRunner);
handler.postDelayed(drawRunner, 30);
}
}
編集:
画像をjpgファイルに変更した後、約6 fpsになりますが、それでも遅くなります。
編集2:
.lockCanvas() を使用している間はハードウェアアクセラレーションが不可能であることがわかりました ハードウェアアクセラレーションを提供するライブ壁紙 (サーフェスビュー) に画像を描画する別の方法はありますか?