핸드폰이 흔들리는 것을 감지하려면, 가속도 센서를 이용합니다. 가속도 센서는 핸드폰을 기준으로 x, y, z 방향으로의 가속도만 측정이 가능합니다. 즉, 이 방향성을 가지는 가속도를 가지고 제대로된 움직임을 감지해야하는 것이죠. 센서를 사용하기 위해 SensorListener를 상속받는 엑티비티를 생성합니다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public class ShakeActivity extends Activity implements SensorEventListener {
 
    private long lastTime;
    private float speed;
    private float lastX;
    private float lastY;
    private float lastZ;
    private float x, y, z;
 
    private static final int SHAKE_THRESHOLD = 800;
    private static final int DATA_X = SensorManager.DATA_X;
    private static final int DATA_Y = SensorManager.DATA_Y;
    private static final int DATA_Z = SensorManager.DATA_Z;
 
    private SensorManager sensorManager;
    private Sensor accelerormeterSensor;
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        accelerormeterSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }
 
    @Override
    public void onStart() {
        super.onStart();
        if (accelerormeterSensor != null)
            sensorManager.registerListener(this, accelerormeterSensor,
            SensorManager.SENSOR_DELAY_GAME);
    }
 
    @Override
    public void onStop() {
        super.onStop();
        if (sensorManager != null)
            sensorManager.unregisterListener(this);
    }
 
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
 
    }
 
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            long currentTime = System.currentTimeMillis();
            long gabOfTime = (currentTime - lastTime);
            if (gabOfTime > 100) {
                lastTime = currentTime;
                x = event.values[SensorManager.DATA_X];
                y = event.values[SensorManager.DATA_Y];
                z = event.values[SensorManager.DATA_Z];
 
                speed = Math.abs(x + y + z - lastX - lastY - lastZ) / gabOfTime * 10000;
 
                if (speed > SHAKE_THRESHOLD) {
                    // doSomething
                }
 
                lastX = event.values[DATA_X];
                lastY = event.values[DATA_Y];
                lastZ = event.values[DATA_Z];
            }
 
        }
 
    }
}
cs


 onCreate 부분에서는 센서를 사용하기 위해서 시스템 서비스를 가져와서 SensorManager 타입으로 저장해둡니다.

onAccuracyChanged와 onSensorChanged를 오버라이딩 해줘야 합니다. 

함수 이름에서 보시듯 정확도와 센서 정보가 변하면 발생하는 함수입니다. 

흔드는 것을 감지하는 핵심적인 소스는 onSensorChanged 함수에 있습니다. 센서가 변함에 따라 이 함수가 실행됩니다. 센서 종류가 가속도 센서일 때, 이벤트를 처리해줘야합니다. 최근 측정한 시간과 현재 시간을 비교하여 0.1초 이상되었을 때, 흔듬을 감지합니다. 이 흔듬을 감지하는 함수는 조금씩 수정이 가능합니다. 자신의 프로그램에 맞게 설정할 해줄 수 있습니다. 기본적으로는 위의 소스코드에서 보이는 것처럼, 가속도의 벡터값을 이용하여 대략적으로 측정합니다. 정확도면에서는 약간 떨어지겠죠. SHAKE_THRESHOLD 또한 잘 설정을 해줘야 합니다. 속도가 얼마 이상일 때, 흔듬을 감지하겠다는 것을 설정해주는 부분입니다.

'Programming > Android' 카테고리의 다른 글

DialogFragment  (0) 2016.09.24
ListView에 각각 Seekbar 넣기  (0) 2016.09.24
Custom Listview  (0) 2016.09.24
ListFragment  (0) 2016.09.24
ScrollView  (0) 2016.09.15

+ Recent posts