안드로이드 개발 질문/답변
(글 수 45,052)
화면에 이미지를 터치했을 때 움직일 수 있는 길을 원으로 한정하고 싶습니다.
아날로그 시계 설정 시 초침 분침 시침을 터치로 셋팅하도록 만들고 싶은데 아무리 생각해도 어떻게 구현해야 될지 몰라서 글 올립니다.
surfaceView를 이용하니 터치 드레그는 돼는데 원형으로 돌도록 만들 수가 없네요.
고수님들 초보라서 그러니 해당 소스나 참고할 사항 있으면 자세한 댓글 부탁드립니다.
아날로그 시계 설정 시 초침 분침 시침을 터치로 셋팅하도록 만들고 싶은데 아무리 생각해도 어떻게 구현해야 될지 몰라서 글 올립니다.
surfaceView를 이용하니 터치 드레그는 돼는데 원형으로 돌도록 만들 수가 없네요.
고수님들 초보라서 그러니 해당 소스나 참고할 사항 있으면 자세한 댓글 부탁드립니다.
2010.07.18 23:10:29
(추천:
1 / 0)
threshold라고 해도 뭐 사실 간단한데요....
해상도가 480x800인 디바이스에서 반지름이 200인 원을 그리고 그 안에서만 터치를 인식하게 하고 싶으시다면,
먼저 원의 중심을 center, 터치 좌표를 coord 라고 정의하겠습니다.
그럼 현재 터치 좌표가 원의 중심으로부터 반지름 200 안에 들어오면 정상적인 터치로 인식하고, 200을 넘으면 정상적인 터치가 아니라고 볼 수 있겠지요.
이걸 식으로 표현하면,
dist2 = (coord(x)-center(x))^2 + (coord(y)-center(y))^2;
터치 좌표와 원의 중심 좌표를 이용해 거리를 구할 수 있고, (굳이 sqrt할 필요는 없습니다. 괜히 계산만 늘 뿐이지요.)
if (dist2 > 40000) return;
거리가 200이상 되면 그냥 스킵 해버리는 것이지요 (40000은 200^2를 말하는 것입니다.)
도움이 되셨을지 모르겠군요^^
원의 중심과 터치 포인트의 위를 이용해서 각도를 알아내서 처리하시면 됩니다.
각도만 알아내면 초침이나 분침을 돌리는건 뭐 쉬우니까 넘어가도록 하겠습니다.
원의 중심을 128, 128 이라고 하고 터치하고 있는 좌표를 192, 64 라고 한다면,
xDelta = 192 - 128;
yDelta = 64 - 128;
이라고 볼 수 있습니다.
이때, xDelta, yDelta를 삼각함수atan을 이용하면 각도를 구할 수 있겠지요.
tan(theta) = yDelta/xDelta 이고 우리가 구하고자 하는 값은 theta이니까,
theta = atan(yDelta/xDelta); 로 볼 수 있습니다.
근데, 제가 잘은 모르겠지만 아마 여기서 나오는 theta가 라디안 값으로 나올 것입니다.
그러니까 실제 degree를 구하려면 degree = theta*180/PI 로 구하실 수 있을 것입니다.
추가적으로 원으로부터 일정 거리 이상은 터치 인식을 막고 싶으면,
원의 중심과 터치의 좌표의 거리를 계산하여 threshold해버리면 됩니다.
그럼 즐거운 개발이 되세요^^