2010-12-28 3 views

ответ

11

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

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

    ускорение.x = 2 (newposition.x - position.x - speed.x * 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). И на каждом новом кадре после касания даже ускорение должно быть установлено на что-то. Он должен работать очень хорошо :)

+1

Смотрел на ваш ответ, и мне интересно, как вы получаете скорость для использования в ускорении, когда ваша формула скорости требует ускорения ... Один зависит и требует другого? – Dan

+0

Вместо того, чтобы вычислять скорость напрямую, это может дать лучшие результаты для использования ускорения. Начальная скорость и ускорение равны 0. Поэтому вам нужно сэкономить скорость, чтобы добавить ее в следующий кадр. Ускорение - это не что иное, как изменение между каждым фреймом. Ускорение может быть deltaX, deltaY. Фактической скоростью будет то, что deltaX * elapsedTime + lastSpeed. Таким образом, скорость вычисляется правильно, даже если кадр занимает много времени или малое время. Другие параметры подделывают немного физически, чтобы добавить инерцию и трение. Вы действительно не хотите, чтобы он прокручивал навсегда. –

1
  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; 
} 
+0

спасибо, вы знаете, как точно я мог контролировать скорость, с которой прокручивается пользователь? Сейчас он просто вычисляет дельта между исходной позицией и конечным положением пальца пользователя, а затем помещает ее в матрицу. – jfisk

+0

Извините, я не знаю Android достаточно хорошо, чтобы помочь с особенностями, такими как местоположение касания и т. Д. – Jumhyn

Смежные вопросы