이 예제는 Android 앱에서 흔들림(Shake) 이벤트를 감지하는 방법을 보여줍니다. 스마트폰의 가속도 센서(Accelerometer)를 활용하면 사용자가 기기를 흔들었을 때를 손쉽게 인식할 수 있으며, 이를 응용하면 흔들어서 새로고침하기, 흔들어서 화면 전환하기 같은 다양한 기능을 구현할 수 있습니다.
1단계 — 새 프로젝트 생성
Android Studio에서 File ⇒ New Project로 이동하여 새 프로젝트를 생성하고, 프로젝트 생성에 필요한 모든 세부 정보를 입력합니다.
2단계 — 레이아웃 파일 작성 (res/layout/activity_main.xml)
아래 코드를 res/layout/activity_main.xml에 추가합니다. 화면에는 흔들림 이벤트를 안내하는 TextView 하나가 배치됩니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:text="흔들림 이벤트를 감지하려면 휴대폰을 흔들어 보세요"
android:textSize="24sp"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>3단계 — 메인 액티비티 구현 (src/MainActivity.java)
아래 코드를 src/MainActivity.java에 추가합니다. 핵심은 SensorManager를 통해 가속도 센서 값을 실시간으로 읽어오고, 센서 값의 변화량(delta)이 임계값(12)을 초과하면 흔들림으로 판단하는 로직입니다.
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
private SensorManager mSensorManager;
private float mAccel;
private float mAccelCurrent;
private float mAccelLast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Objects.requireNonNull(mSensorManager).registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
mAccel = 10f;
mAccelCurrent = SensorManager.GRAVITY_EARTH;
mAccelLast = SensorManager.GRAVITY_EARTH;
}
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta;
if (mAccel > 12) {
Toast.makeText(getApplicationContext(), "Shake event detected", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
@Override
protected void onResume() {
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
super.onResume();
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(mSensorListener);
super.onPause();
}
}핵심 로직 설명
위 코드의 흔들림 감지 원리를 간단히 정리하면 다음과 같습니다.
① X, Y, Z 축의 가속도 값을 가져온 후, 세 축 값의 제곱합에 루트를 적용해 현재 가속도 크기를 계산합니다.
② 이전 가속도 값과 현재 가속도 값의 차이(delta)를 구합니다.
③ 저역 통과 필터 역할을 하는 mAccel = mAccel * 0.9f + delta 공식으로 노이즈를 줄입니다.
④ 계산된 값이 임계값인 12보다 크면 기기가 흔들린 것으로 판단하고 Toast 메시지를 표시합니다.
또한 onResume()에서 리스너를 등록하고 onPause()에서 해제함으로써, 앱이 화면에 보일 때만 센서를 사용하도록 하여 배터리 소모를 최소화했습니다.
4단계 — 매니페스트 확인 (androidManifest.xml)
아래 코드를 androidManifest.xml에 추가합니다. 가속도 센서는 일반 권한이 아닌 일반(normal) 센서이므로 별도의 사용자 권한 선언은 필요하지 않습니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 Android 휴대폰이 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바에서 Run 아이콘을 클릭하세요. 실행 옵션 목록에서 자신의 모바일 기기를 선택하면, 휴대폰에 아래와 같은 기본 화면이 표시됩니다.

앱이 실행된 상태에서 휴대폰을 실제로 흔들어 보면, 화면에 "Shake event detected"(흔들림 이벤트가 감지되었습니다)라는 Toast 메시지가 나타나는 것을 확인할 수 있습니다. 임계값(12)을 조절하면 흔들림 감지의 민감도를 튜닝할 수 있으니, 여러분의 앱에 맞게 값을 조정해 보세요.