У меня есть два растровых изображения одного и того же изображения в моем приложении, на которых я хочу выполнить анимацию движущегося фона. Я использую SurfaceView для этого. Текущая логика, которую я применяю, оставляет видимый разрыв между двумя растровыми изображениями, когда они снова рисуют себя после пересечения всей ширины экрана.
Координата X одного растрового изображения начинается с 0, а для другого растрового изображения - 0 + ширина поверхности. Вот что я делаю на SurfaceCreated:
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
startX = 0;
endX = getWidth() - 1;
bitmap1 = Bitmap.createScaledBitmap(getBitmap(Views.plat), getWidth(), getHeight() / 5, false);
bitmap2 = Bitmap.createBitmap(bitmap1);
px1 = startX;
px2 = endX + 1;
py = getHeight() - bitmap1.getHeight();
//
Canvas canvas = surfaceHolder.lockCanvas();
if (canvas != null) {
draw(canvas);
surfaceHolder.unlockCanvasAndPost(canvas);
}
//
threader = new Threader(this, surfaceHolder);
threader.setRunning(true);
threader.setPause(true);
threader.start();
} catch (Exception ex) {
ex.printStackTrace();
alert("Surface Created : " + ex.getMessage());
}
}
Вот метод рисования для рисования двух растровых изображений:
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
try {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bitmap1, px1, py, null);
canvas.drawBitmap(bitmap2, px2, py, null);
} catch (Exception ex) {
ex.printStackTrace();
alert("Draw : " + ex.getMessage());
}
}
Вот обновление для обновления px1 и px2 Метод:
void update() {
try {
final int speed = 10;
px1 = nextX(px1, speed);
if (px1 == endX)
px2 = startX;
else
px2 = nextX(px2, speed);
} catch (Exception ex) {
ex.printStackTrace();
alert("Update : " + ex.getMessage());
}
}
Логика расчета следующего X:
private int nextX(final int x, final int speed) {
final int next = x + endX;
if (next == startX) {
return endX;
}
if (next >= speed) {
return x - speed;
}
return x - next;
}
У меня нет изображений, чтобы показать, что происходит, поэтому я пишу псевдокод:
1. Bitmap1 = ------------
Bitmap2 = ------------
2. Placements:
Bitmap1Bitmap2
------------------------
3. Expectation:
When Animation / Thread Starts, what I expected is an unbroken drawing of bitmaps on screen, like this :
Bitmap1Bitmap2Bitmap1Bitmap2Bitmap1Bitmap2Bitmap1Bitmap2Bitmap1Bitmap2
------------------------------------------------------------------------
What I am getting:
Bitmap1Bitmap2 Bitmap1Bitmap2 Bitmap1Bitmap2
------------------------ ------------------------ ------------------------
Обратите внимание на разрыв в том, что я получаю. Этот разрыв увеличивается по мере того, как я увеличиваю значения скорости в методе обновления.
Конечно, есть проблема в логике либо в обновлении, либо в следующемX. Пожалуйста, помогите мне определить правильную логику.