Мерцание при рисовании растровых изображений с помощью canvas в Android - PullRequest
0 голосов
/ 21 марта 2012

Я пытаюсь сделать меню на основе растровых изображений.Само меню должно быть подвижным с помощью событий перемещения экрана, в основном я хочу перетаскивать кнопки на виде.Кнопка также включает обнаружение столкновений, поэтому, когда они касаются друг друга, они отскакивают друг от друга.

Но у меня возникают некоторые проблемы, когда дело касается рисования моих растровых изображений.В настоящее время я использую прямоугольник для масштабирования своего растрового изображения в соответствии с окном моего устройства.Хочу я хочу и не могу получить в настоящее время для плавных движений моих растровых изображений без мерцания.Это единственный вариант перейти к открытию гл?Или я пропустил что-то большое в своем коде?

Это мой вид поверхности для рисования каждой кнопки, где MenuButton - это класс, который содержит растровое изображение и обновляет свою позицию в соответствии с движением касания и перетаскивания.

protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.WHITE);

    for(MenuButton menuButton : menuButtonSprites) {
        menuButton.onDraw(canvas);
    }
}

Я хочу, чтобы растровые изображения масштабировались до ширины каждого устройства, и для этого я использую прямоугольник для растрового изображения, чтобы соответствовать.

public MenuButton(MenuView v, Bitmap bmp, int yPosition){
    this.menuView = v;
    this.menuButton = bmp;
    this.xMax = v.getWidth();
    this.yPosistion = yPosition;
    menuButtonRectangle = new Rect(xMin, this.yPosistion-yMin, xMax, this.yPosistion+yMax);
}

public void update(int y){
    if(menuButtonPressed)
    {
        this.yPosistion = y;
        menuButtonRectangle.set(xMin, yPosistion-yMin, xMax, yPosistion+yMax);
    }
}

public void onDraw(Canvas canvas){
    canvas.drawBitmap(menuButton, null, menuButtonRectangle, null);
}

У меня также есть нить, которая обновляет ничью

public void run() {
    long ticksPS = 1000 / FPS;
    long startTime;
    long sleepTime;
    Canvas c = null;

    while (running) {
        startTime = System.currentTimeMillis();
        try {
            c = view.getHolder().lockCanvas();
            synchronized (view.getHolder()) {
                view.onDraw(c);
            }
        } 
        finally {
            if (c != null) {
                view.getHolder().unlockCanvasAndPost(c);
            }
        }

        sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
        try {
            if (sleepTime > 0)
                sleep(sleepTime);
            else
                sleep(10);
        } 
        catch (Exception e) {
        }
    }
}

Я действительно не знаю, что я делаю неправильно, и почему мне не удается добиться плавного движения моих кнопок.Это недостаток использования canvas или я пропустил что-то действительно важное: D?

1 Ответ

0 голосов
/ 21 марта 2012

Обычно эта проблема возникает, когда существует проблема синхронизации во время рисования. Это может происходить из-за более высокой частоты кадров или также может быть более низкой частотой кадров. Проблема такого рода может быть исправлена ​​двойной буферизацией или настройкой частоты кадров.

Двойная буферизация означает, что вместо рисования изображения непосредственно на главном холсте, мы будем создавать пустое растровое изображение размера экрана и получать графический объект. Рисование каждой вещи на растровом изображении, а затем непосредственное рисование этого растрового изображения на основном холсте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...