2012-11-04 3 views
0

사용자가 손가락을 터치하고 끌 때 다이얼이 회전합니다. 지금까지는 그렇게 좋았지 만 다이얼이 360을 넘으면 값은 0으로 돌아가고 애니메이션은 계속 진행되는 대신 다이얼 주위로 뒤로 이동합니다.다이얼 회전 점프

아무도 점핑을 중지하는 방법을 알고 있습니까?

+0

실제로 애니메이션을 수행하는 코드를 보여줍니다. –

+0

senderImage-> rotationZ (dialRotation); – user1794021

+0

Objective-C를 사용하지 않는 것 같습니다. 이 질문은 왜 객관적으로 태그가 붙여 집니까? –

답변

0

기존 값을 사용하여 360을 넘어야하는지 여부를 결정할 수 있습니다. 이 같은 아마 뭔가 :

currentValue = dialRotation; 
dialRotation = (atan2(event->localY()-circleCenterY, event->localX()-circleCenterX) * (180/M_PI)); 
dialRotation = 360.0 * floor(fmod(currentValue, 360.0)) + dialRotation; 

나는이 가끔 음수 fmod()의 행동에 혼란 얻을하지만 너무, 너무, 음의 방향으로 작동을 확인하십시오 것이라 생각합니다.

+0

답변을 더 자세히 설명해 주시겠습니까? currentValue 및 newAngle은 무엇입니까? – user1794021

+0

'currentValue'는 사용자가 누르거나 다른 것을 눌러서 변경해야한다고 결정할 때 컨트롤의 값입니다. 'newAngle'은 대개'atan2 (y, x);와 같은 결과입니다. 여기서 y, x는 다이얼의 중심에 대한 마우스 누름 또는 터치의 좌표입니다. (이것은 시계 반대 방향으로 0도와 양수가되도록하려는 것입니다.) – user1118321

+0

이것은 사용자가 360을 지나갈 때 여전히 0으로 돌아가므로 손가락을 계속 따라 가지 않고 다이얼을 뒤로 점프합니다. – user1794021

0

또 다른 방법은 이전 값과 현재 값 사이의 델타 (변경)를 가져와 기존 값에 추가하는 것입니다. 차이가 180도를 넘지 않는 한, 더 잘 작동 할 것입니다. 다음과 같이 입력하십시오 :

// In your class declaration: 
float normalizedRotation; // Always between 0 and 360 degrees 
float previousNormalizedRotation; 
float dialRotation; // current value, can be any valid value from -inf to +inf 

// In your method: 
normalizedRotation = (atan2(event->localY()-circleCenterY, event->localX()-circleCenterX) * (180/M_PI)); 
if (normalizedRotation < 0.0) normalizedRotation += 360.0; 
float delta = normalizedRotation - previousNormalizedRotation; 
previousNormalizedRotation = normalizedRotation; 
dialRotation += delta; 

알려 주시면 알려드립니다.

+0

또 다른 답변을 주셔서 감사합니다. 이렇게하면 다이얼이 회전하지만 359 ... 0이되면 다이얼이 다시 돌아옵니다. – user1794021