안드로이드에서 사용자가 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가 감지될때, 이벤트 발생이라는 로그를 볼 수 있습니다.
'Android 개발 > Android' 카테고리의 다른 글
Callable 과 Runnable 뭐가 다른가요? (0) | 2017.03.18 |
---|---|
Parcelable 을 사용해 데이터를 전달해 보자 (1) | 2017.03.13 |
AlarmManager 로 구현하는 안드로이드 알람 (3) | 2017.03.13 |
CompileSdkVersion, MinSdkVersion, TargetSdkVersion 그리고 BuildToolsVersion (0) | 2017.03.12 |
Activity 와 Fragment 의 lifecycle (생명주기) (1) | 2017.02.18 |
Manifest 에서 Activity 속성 Android 최근 사용합 앱에서 제외시키기 (0) | 2017.02.13 |
bundle 객체로 보낸 데이터를 onActivityResult 로 받아오기 (0) | 2017.01.24 |
Fragment 에서 Activity 로 데이터 전달하기 (0) | 2017.01.16 |
Android 에서 패키지명 ( Package Name ) 변경 하기 (5) | 2017.01.14 |
Android 에서 Activity로 Object넘겨줄 때엔 Serializable (0) | 2016.12.26 |
댓글