다음 처럼 구현
public class DeviceSensorManager implements SensorEventListener {
private SensorManager sensorManager;
private Sensor magneticSensor;
private Sensor accelerometerSensor;
private final float[] rotationMatrix = new float[16];
private float[] valuesMagnet = new float[3];
private float[] valuesAccel = new float[3];
private float[] orientation = new float[3];
public DeviceSensorManager(Context context) {
sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magneticSensor = sensorManager.getDefaultSensor((Sensor.TYPE_MAGNETIC_FIELD));
}
public void start() {
sensorManager.registerListener(this, accelerometerSensor,SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this, magneticSensor,SensorManager.SENSOR_DELAY_GAME);
}
public void stop() {
sensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
valuesAccel[0] = event.values[0];
valuesAccel[1] = event.values[1];
valuesAccel[2] = event.values[2];
} else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
valuesMagnet[0] = event.values[0];
valuesMagnet[1] = event.values[1];
valuesMagnet[2] = event.values[2];
}
SensorManager.getRotationMatrix(rotationMatrix,null, valuesAccel, valuesMagnet);
SensorManager.remapCoordinateSystem(rotationMatrix,SensorManager.AXIS_X, SensorManager.AXIS_Z,
rotationMatrix);
SensorManager.getOrientation(rotationMatrix, orientation);
Log.d("TEST", "orientation ::: " + orientation[0] + " , "+ orientation[1] + " , " + orientation[2]);
orientation[0] = (float)(Math.toDegrees(orientation[0]));
orientation[1] = (float)(Math.toDegrees(orientation[1]));
orientation[2] = (float)(Math.toDegrees(orientation[2]));
Log.d("TEST", "orientation :: degrees ::: " + orientation[0] + " , "+ orientation[1] + " , " + orientation[2]);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
* SensorManager.getRotationMatrix(... 이건 가속값과 자기값으로 회전 매트릭스 구함
* SensorManager.remapCoordinateSystem(... 이 구문은 카메라로 볼때를 고려해서 축을 바꾸는 것.
원래는 폰을 눕혔을 때 기준인데, 이걸로 세웠을 때 기준으로 바뀜
* SensorManager.getOrientation(... 회전 매트릭스로 회전값 구함
* Math.toDegrees(... 라디안을 도로 바꿈
여기서 센서 값이 튄다(갑자기 너무 크거나, 너무 작은 값이 들어옴).
다음과 같은 걸 활용해서 값을 스무하게 해주면 좋음.
SensorSmoother.java
public class SensorSmoother {
private static final float DEFALUT = 0.333f;
private static final float LOW = 0.001f;
//private static final float MEDIUM = 0.6f;
//private static final float HIGH = 0.9f;
private static final float MEDIUM = 0.05f;
private static final float HIGH = 0.6f;
public static float[] getSmoothValues(float min, float max, float[] values, float[] prev){
float val = DEFALUT;
float dis = (float)(Math.sqrt(Math.pow((double)(prev[0] - values[0]), 2d) +
Math.pow((double)(prev[1] - values[1]), 2d) +
Math.pow((double)(prev[2] - values[2]), 2d)
));
if(dis < min){
val = LOW;
}else if(dis >= min || dis < max){
val = MEDIUM;
}else{
val = HIGH;
}
for(int i=0; i<values.length; i++){
prev[i] = prev[i] + val * (values[i] - prev[i]);
}
return prev;
}
}
수치는 적당히 알아서 조절
위에서 event.values 를 그대로 쓰지 말고, 이걸로 값을 변화시켜서 쓰면됨. 쓰는 예는 별도로 기록 안함.
'android tech.' 카테고리의 다른 글
파일 이어받기 (0) | 2015.12.02 |
---|---|
Https 및 언어에 따라 Json 다운로드 (0) | 2015.12.01 |
Beacon 연동 (0) | 2015.08.31 |
Obb 파일 다운로드 (0) | 2015.08.31 |
Obb 파일 안에 있는 영상 재생 (0) | 2015.08.31 |