У меня есть OpenGL ES View в Android, который управляется матрицей для перевода. Я пытаюсь выяснить способ получить подсказку прокрутки импульса, как видно в приложении Google Maps или iPhone. Благодарю.плавная прокрутка/инерциальная прокрутка/прокрутка импульса
ответ
Если ваша проблема в 2D, это довольно просто
- Вы должны получить истекшее время в каждом кадре
Ваш onTouch функция найдет ускорение вашего пальца. Я забыл формулу о том, как получить ускорение с расстояния. Он должен быть второй производной от позиции с переменной времени. Но вы всегда должны конвертировать deltaX, deltaY в ускорение. Чтобы облегчить вам, вам действительно не нужно размещать там что-то точное. Редактировать: я не знаю, почему я его не видел, но функция была там ...
ускорение.x = 2 (newposition.x - position.x - speed.x * elapsedTime)/(прошедшее время * пройденное время);
Как только у вас есть ускорение, вы можете установить свою новую позицию с помощью этого кода. Это простая физическая динамика в 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). И на каждом новом кадре после касания даже ускорение должно быть установлено на что-то. Он должен работать очень хорошо :)
- Измерьте скорость, с которой прокручивается вид.
- Определите, когда пользователь прекратит прокрутку.
- Постепенно уменьшайте скорость прокрутки прокрутки.
Что-то вроде этого:
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;
}
спасибо, вы знаете, как точно я мог контролировать скорость, с которой прокручивается пользователь? Сейчас он просто вычисляет дельта между исходной позицией и конечным положением пальца пользователя, а затем помещает ее в матрицу. – jfisk
Извините, я не знаю Android достаточно хорошо, чтобы помочь с особенностями, такими как местоположение касания и т. Д. – Jumhyn
- 1. полусинусоидальное формирование импульса
- 2. Применение импульса к пулям
- 3. Уравновешивающие уравнения переноса импульса
- 4. Выполнение импульса управления пользователя
- 5. Измерение ширины импульса
- 6. FFT гауссовского импульса
- 7. Значения линейного импульса
- 8. плавная прокрутка
- 9. Плавное изменение направления импульса SKPhysicsBody
- 10. Создание двухмерного импульса в октаве
- 11. Применение импульса на узле SpriteKit
- 12. Оптимизатор adam и оптимизатор импульса
- 13. Изменение цвета импульса на CheckBox
- 14. Android ListView прокручивает без импульса
- 15. Плавная потоковая поддержка вспышки?
- 16. Плавная анимация в javascript
- 17. javascript плавная прокрутка страницы
- 18. Плавная горизонтальная полоса прокрутки
- 19. плавная CSS3 Рождество анимация
- 20. Плавная прокрутка не работает
- 21. плавная прокрутка в сНу
- 22. Плавная прокрутка колеса мыши
- 23. Более плавная анимация ImageSwitcher
- 24. Плавная прокрутка не работает
- 25. Плавная прокрутка с jQuery
- 26. Плавная линия после масштабирования
- 27. Плавная прокрутка страницы
- 28. Плавная остановка анимации
- 29. Плавная прокрутка вниз
- 30. Плавная цветовая анимация
Смотрел на ваш ответ, и мне интересно, как вы получаете скорость для использования в ускорении, когда ваша формула скорости требует ускорения ... Один зависит и требует другого? – Dan
Вместо того, чтобы вычислять скорость напрямую, это может дать лучшие результаты для использования ускорения. Начальная скорость и ускорение равны 0. Поэтому вам нужно сэкономить скорость, чтобы добавить ее в следующий кадр. Ускорение - это не что иное, как изменение между каждым фреймом. Ускорение может быть deltaX, deltaY. Фактической скоростью будет то, что deltaX * elapsedTime + lastSpeed. Таким образом, скорость вычисляется правильно, даже если кадр занимает много времени или малое время. Другие параметры подделывают немного физически, чтобы добавить инерцию и трение. Вы действительно не хотите, чтобы он прокручивал навсегда. –