Когда я разработал точно такую же вещь для Android, я также не смог найти никаких полезных примеров / статей для реализации этого, поэтому я сделал это так:
Когда пользователь касается экрана и делает бросок/ swipe (перемещает палец по экрану и удаляет его с экрана) вы вычисляете скорость X и скорость Y в пикселях / секунду (в андроиде у вас есть метод onFling (float velocitY, float velocitX)).
Затем вы конвертируете скорость в пикселях в секунду в обороты в секунду.Это означает, что если бы пользователь переместился на 1500 пикселей за 1 секунду, ваше колесо вращалось бы X раз.Например, если скорость отбрасывания / прокрутки X и скорость Y составляют 1500 пикселей / с, а радиус вашего колеса составляет 150 пикселей, вы вычисляете длину дуги колеса следующим образом:
arc = r * PI. (r=150)
Затем вычисляете скорость в оборотах насекунда, подобная этой:
spinSpeed = Math.sqrt((speedX*speedX)+(speedY*speedY))/arc)*360
Получив скорость, вы можете изменять угол поворота колеса каждые T милисекунд (я использовал 40 миллисекунд) следующим образом:
wheel.angle += spinSpeed;
Вы также должны реализоватьперетащите, чтобы колесо в конце концов замедлилось, например:
spinSpeed -= drag_value;
wheel.angle += spinSpeed;
Вы должны отрегулировать drag_value до желаемого эффекта (насколько быстро он замедляется).Возможно, вы также захотите умножить spinSpeed на константу, чтобы получить более высокую скорость (я использовал 40).
Эта реализация не включает колесо, следующее за пальцем пользователя.Для этого вам необходимо рассчитать, сколько пальцев пользователь сдвинул с момента последнего касания экрана (для координат X и Y).Таким образом, вам нужно 2 координаты (lastTouchX, lastTouchY, newTouchX, newTouchY).Когда у вас есть координаты, вы можете рассчитать наклон или градиент линий, которые проходят через эти координаты (наклон / градиент в этой формуле равен K: y = kx + n - стандартная формула линии).Затем вы должны рассчитать угол пересечения между этими двумя линиями и применить его к колесу.Примерно так:
tg = ((k1-k2)/(1+(k1*k2))); // k1 is the slope of the previous touch coordinate; k2 is the slope of the current touch coordinates
angle = Math.toDegrees(Math.atan(Math.abs(tg)));
wheel.angle += angle; // to implement spinning in the other way use wheel.angle -= angle;
Надеюсь, вы поняли идею