Логика для правильного расчета X Cordinate для рисования для постоянно движущихся изображений - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть два растровых изображения одного и того же изображения в моем приложении, на которых я хочу выполнить анимацию движущегося фона. Я использую 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. Пожалуйста, помогите мне определить правильную логику.

...