плавная прокрутка / инерционная прокрутка / импульсная прокрутка - PullRequest
9 голосов
/ 28 декабря 2010

У меня есть OpenGL ES View в Android, который управляется матрицей для перевода. Я пытаюсь найти способ получить подсказку о прокрутке импульса, как это видно в приложении Google Maps или iPhone. Спасибо.

Ответы [ 2 ]

11 голосов
/ 06 января 2011

Если ваша проблема в 2d, это довольно просто

  1. Вам нужно получить истекшее время в каждом кадре
  2. Ваша функция onTouch обнаружит ускорение вашего пальца. Я забыл формулу о том, как получить ускорение на расстоянии. Это должна быть вторая производная от позиции с переменной времени. Но вы всегда должны конвертировать ваш deltaX, deltaY в ускорение. Чтобы упростить процесс, вам не нужно помещать что-то точное там. Редактировать: я не знаю, почему я не видел его, но функция была все там ...

    acceleration.x = 2 (newposition.x - position.x - speed.x * elapsedTime) / (elapsedTime * elapsedTime);

  3. Получив ускорение, вы можете установить новую позицию с этим кодом. Это простая физическая динамика в 2d. С вашим ускорением вы можете найти свою скорость, а с вашей скоростью вы можете найти свою следующую позицию.

    speed.x = (float) (mass * acceleration.x * elapsed + speed.x);
    speed.y = (float) (mass * acceleration.y * elapsed + speed.y);
    
    
    position.x += mass * acceleration.x / 2 * elapsed * elapsed + speed.x * elapsed;
    position.y += mass * acceleration.y / 2 * elapsed * elapsed + speed.y * elapsed;
    
    
    speed.x *= friction;
    speed.y *= friction;
    

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

В конце каждого кадра вам нужно будет сбросить ускорение до (0,0). И на каждом новом кадре даже после прикосновения ускорение должно быть установлено на что-то. Должно работать очень хорошо :) 1020 *

1 голос
/ 28 декабря 2010
  1. Измерение скорости прокрутки при просмотре.
  2. Определение, когда пользователь прекращает прокрутку.
  3. Постепенное уменьшение скорости прокрутки при просмотре.

Примерно так:

public void redraw() {
    myScrollView.ySpeed = myScrollView.lastY-myScrollView.y;
    myScrollView.xSpeed = myScrollView.lastX-myScrollView.x;
    if (!userIsScrolling && ySpeed > 0) {
        ySpeed--;
    }
    if (!userIsScrolling && xSpeed > 0) {
        xSpeed--;
    }
    myScrollView.lastY = myScrollView.y;
    myScrollView.y += ySpeed;
    myScrollView.lastX = myScrollView.x;
    myScrollView.x += xSpeed;
}

public void userStoppedScrolling() {
    userIsScrolling = false;
}
...