2016-07-07 2 views
3

내가 코드 아래 이것에 의해 올바른 전화 흔들림을 감지하기 위해 노력하고있어 흔들 감지,하지만 난 RIGHT을 얻거나 RIGHTLEFT 모두를 얻을 왼쪽으로 전화를 흔들 때 자주 예를 들어, 제대로 작동하지의 :안드로이드는 올바른 전화

@Override 
    public void onSensorChanged(int sensor, float[] values) { 
     if (sensor == SensorManager.SENSOR_ACCELEROMETER) { 
      long curTime = System.currentTimeMillis(); 
      // only allow one update every 100ms. 
      if ((curTime - lastUpdate) > 200) { 
       long diffTime = (curTime - lastUpdate); 
       lastUpdate = curTime; 

       x = values[SensorManager.DATA_X]; 
       y = values[SensorManager.DATA_Y]; 
       z = values[SensorManager.DATA_Z]; 

       if (Round(x, 4) > 10.0000) { 
        Toast.makeText(this, "Right shake detected", Toast.LENGTH_SHORT).show(); 
       } else if (Round(x, 4) < -10.0000) { 
        Toast.makeText(this, "Left shake detected", Toast.LENGTH_SHORT).show(); 
       } 

       last_x = x; 
       last_y = y; 
       last_z = z; 
      } 
     } 
    } 

POST 업데이트 :

if (Utils.Round(x, 4) > 8.0000) { 
    //left 
} else if (Utils.Round(x, 4) < -8.0000) { 
    //right 
} else if (z > 9 && z < 10) 
    //down 
else if (z > -10 && z < -9) 
    //up 

답변

2

는 가속도계의 작동 방식에 대해 생각해보십시오. 가속을 감지합니다. 휴대 전화를 오른쪽으로 움직이면 오른쪽으로 가속 한 다음 일정한 속도로 움직이면 0이됩니다. 그 때 손을 멈출 때, 당신이 감속 할 때 당신이 멈출 때 가속도가 다시 0이 될 때, 당신은 음의 가속도 (왼쪽으로의 가속도)를 보게 될 것입니다.

즉, 각 동작마다 항상 양수/음수 쌍이 표시됩니다. 둘 다 보았을 때, 그 각각은 필터를 트리거하기에 충분히 강했기 때문입니다. 당신이 잘못된 것을 보았을 때, 그것은 가속이 너무 느려서 그것을 작동시킬 수 없음을 의미하지만, 감속은 충분히 빠릅니다. 당신은 거의 오랫동안 디 바운싱하지 않습니다. 당신의 쉐이크가 200ms로 시작하고 끝나는 오른쪽 움직임 인 감속을 감지하지 못하도록합니다. 얼마 안됐어. 정말 좋은 결과를 원한다면 DSP 알고리즘을 조사해야하지만, 그 모든 개념을 검토하는 것은 그 자체의 작은 책입니다.

가속도가 울립니다. 가속도계가 물리적으로 작동하는 방식 - 체중에 의해 뻗어있는 스프링 이미지. 그것은 중간 값을 오버 슈트 (overshoot)하고, 다시 되돌아 와서 여러 번합니다. 그 이후의 데이터와 그 파동의 간섭은 이상한 결과를 가져올 수 있습니다. 강한 링이 필터를 여러 번 돌릴 수도 있습니다.

아, 또한 여기에 currentTimeMillis를 사용하지 말아야합니다. 센서 이벤트에는 시간 필드가 있습니다. 사건이 실제로 일어난 때입니다. 시스템이 사용중인 경우 이벤트가 처리되기까지 수 백 밀리 초가 걸릴 수 있습니다. 이벤트를 처리하는 시간이 아닌 이벤트 필드에서 시간을 사용하십시오. 그것이 다른 문제를 남겨 두지 만, 조금 도움이 될 수도 있습니다.

+0

확인, 코드를 변경하고 테스트 해 보겠습니다. –

+0

대단히 죄송합니다. 점점 더 많은 코드를 변경 한 후에, 코드를 수정할 수 있습니까? 게시물을 업데이트했습니다, 감사합니다. –