Когда я разработал то же самое на Android, я также не смог найти никаких полезных примеров/статей для реализации этого, поэтому я сделал это следующим образом:
Когда пользователь прикасается к экрану и выполняет пролистывание/пролистывание (проводит пальцем по экрану и убирает его с экрана), вы вычисляете скоростьX и скоростьY в пикселях/секунду (в Android у вас есть метод 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;
Надеюсь, вы поняли идею
person
blejzz
schedule
10.08.2011