본문 바로가기
Android 개발/Android

안드로이드 에서 Shake (흔들림) 감지 하기

by Developer88 2017. 2. 7.
반응형

안드로이드에서 사용자가 shake하는 모션을 감지해내야 할때는 어떻게 해야할까요?

오늘은 안드로이드 시스템에서 제공해주는, SensorManager를 이용해서 Shake를 감지하는 방법에 대해서 정리해보겠습니다.


1. SensorManager 얻어오기


 Context.getSystemService() 를 통해서 SensorManger객체를 얻어올 수 있는데요.

얻어오는 것 뿐만이아니라, 사용하지 않을 때, disable하는 것은 매우 중요합니다.

이 Manager를 사용하는 것이 Battery를 소모시키기 때문입니다.


먼저, SensorManger를 얻어오겠습니다.




다음으로, 사용자의 움직임을 Listening할 수 있도록, SensorEventListener를 implement해줄깨요.

구현해야할 메소드들이 나오는데요. 바로, onSensorChanged와 onAccuracyChanged입니다.



listener의 등록과 해제는 onResume()과 onPause에서 해줍니다.

배터리 소모를 생각해서, onPause에서 unregister해주는 것은 매우 중요합니다.




2. Sensor 값 얻어오기


값을 얻어오기 전에, X, Y, Z축에 대해서 알아야 하는데요.

사용자가 핸드폰을 흔들때 어떤 방향으로 흔드는 지에 대한 각각의 값입니다.

우리가 흔히아는 x,y축에 z축(앞, 뒤 라고 표현하면 될까요?)이라는 값이 더해져 있습니다.


 (https://developer.android.com/images/axis_device.png 참조)


먼저 아래와 같이 x,y,z값을 구해보겠습니다.

인자로 들어온 event의 values라는 배열값들중 0,1,2번째 값이 각각 x, y, z축입니다.




위에서 구한 X,Y,Z 값을 이용해서 중력가속도값을 구하고,

그 값을 기준으로 지구의 중력보다 더 큰값이 주어지면, 

사람이 흔들어서 힘을 아래로 주어, 중력을 더해준 것이 되는데요.

이러한 것을 이용하여 코딩하도록 하겠습니다.

(중력가속도에 대한 정의는 

https://en.wikipedia.org/wiki/G-force 에서 볼 수 있구요.

중력가속도 값을 구하는 공식은 잘 알지 못해서

http://joerichard.net/android/android-shake-detector/ 를 참조하였습니다)


여기서는 2.7f이상의 중력가속도가 나오면, Shake된것으로 보도록 하는 것이구요.

한번 Shake가 되고나서, 0,5초가 지난 경우는 무시하도록 되어있습니다.






이제 앱을 안드로이드에서 실행하고 흔들어보면, 로그화면에서 Shake가 감지될때, 이벤트 발생이라는 로그를 볼 수 있습니다.


728x90

댓글