출처: 스택오버플로우 + http://www.bytefish.de/wiki/android
안드로이드나 다른 프로그램도 마찬가지 이겠지만
급변하는 값에 대해서 조금 스무스 하게 어떻게 할수 없을까 하고 의문을 가지게 됩니다.
예를 들어서 센서로 기울기값을 받는데 이 기울기값을 그대로 받게 된다면 (FASTEST로..) 매우 빠른 값을 가져오기때문에
보기에도 불편하고 나중에 ui로 만들어도 그렇게 이쁘게 나타나지 않습니다.
이럴떄 사용하는것이 로우패스필터공식입니다.
공식사용법은 다음과 같습니다.
private float mFilteringFactor = 0.8f;
//을 먼저 선언하시고
// smooth data (low-pass filter)
mOrientation = (orientation*mFilteringFactor) + (mOrientation*(1.0f-mFilteringFactor));
이렇게 하시면 됩니다.
저 위에서 mFilteringFactor을 조절하면 얼마나 스무스하게 값을 내 뱉을 것인가에 대한 답변이 될거 같습니다.
제가 쓴 예를 보여드리겠습니다.
mOrientationListener = new OrientationEventListener(this,
SensorManager.SENSOR_DELAY_FASTEST) {
public void onOrientationChanged(int orientation) {
//mOrientation = orientation; <- 원래 우리가 센서를 쓸때 사용하는 방법
mOrientation = (orientation*mFilteringFactor) + (mOrientation*(1.0f-mFilteringFactor));//<ㅡ 스무스한 센서를 사용하고싶을때
// mView.invalidate();
}
};
mOrientationListener.enable();
끝까지 봐 주셔서 감사합니다.
잘쓰이길 바랍니다.
p.s.센서 말고도 다른 급변하는 값에도 위와같이 쓸 수 있습니다.
p.s.2.참고로 SENSOR_DELAY_FASTEST값도 NORMAL, UI 같은 값으로 변경가능합니다. 이 값과 mFilteringFactor 값을 잘 조정하셔서 원하시는 스무스 한 이동을 찾으시면 될 것입니다.
혹시나 onTouchEvent에 적용할 수 있을까요?
MotionEvent.ACTION_MOVE 시 데이터를 갱신하는 간격이 너무 짧아 문제가 좀 있는데;;