2014-05-10 6 views
1

휴대 전화의 Y 축 주변 회전을 감지하는 방법은 무엇입니까?Y 축을 중심으로 회전을 감지 Android Java

android phone axis

나는 안드로이드에 초보자입니다. 180도 회전을 감지하고 싶습니다. 예를 들어, 사용자가 테이블 위에 놓여있는 전화를 튀기거나 사용자가 주머니에서 전화를 돌리는 경우를 감지하고 싶습니다.

많은 기사를 읽었지만 전화 위치를 얻은 다음 다른 위치 사이의 각도를 계산하는 방법을 이해하지 못합니다.

나는 예를 들어,이 기사를 발견했다하지만 난 배열라는 이름의 오리엔테이션과 함께 무엇을 해야할지하지 않습니다

Get device angle by using getOrientation() function

감사합니다!

// 여기 내 해결책이 있습니다. 완벽하게 논리적하지만 아주 좋은 작동합니다

public class FlipListener implements SensorEventListener { 

    SensorManager sensorMgr; 
    FlipEventReceiver receiver; 

    public FlipListener(Context context, FlipEventReceiver receiver) { 
     this.receiver = receiver; 
     sensorMgr = (SensorManager) context.getSystemService(Activity.SENSOR_SERVICE); 
     sensorMgr.registerListener(this, sensorMgr.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_UI); 
    } 

    public void onResume() { 
     sensorMgr.registerListener(this, sensorMgr.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_UI); 
    } 

    public void onPause() { 
     sensorMgr.unregisterListener(this); 
     clearStack(); 
    } 

    private static final int IGNORE_FLIPS_AFTER_FLIP = 2500; 
    private static final int SAMPLING_INTERVAL = 60; 
    private static final int MINIMAL_STACK_SIZE_TO_FLIP = 2; // Shouldn't be lower than 2 
    private static final float FLIP_RADIANS = (float)Math.toRadians(140); 
    private static final int STACK_MAX_SIZE = 38; 

    private List<Float> stack = new ArrayList<Float>(); 
    private long lastAdd = 0; 
    private long lastFlip = 0; 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) { 
      rotationRateAroundYChanged((float)event.values[1]); 
     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    } 

    private void rotationRateAroundYChanged(float rotationRateAroundY) { 
     long currentTime = System.currentTimeMillis(); 

     if (lastFlip != 0 && (currentTime - lastFlip) < IGNORE_FLIPS_AFTER_FLIP) { 
      return; 
     } 

     if((currentTime - lastAdd) >= SAMPLING_INTERVAL) { 
      if(Math.abs(rotationRateAroundY) > 0.3) { // Smaller values are unimportant. They can make only mess. 
       addToStack(rotationRateAroundY); 
       checkForFlip(); 
      } 
     } 
    } 

    private void checkForFlip() { 

     int stackSize = stack.size(); 
     if(stackSize < MINIMAL_STACK_SIZE_TO_FLIP) return; 
     float approximateAngleSummary = 0; 
     float val; 

     for(int i = 0; i < stackSize; i++) { 
      val = Math.abs(stack.get(i).floatValue()); 
      // "+ Math.pow(val/4.58, 2))" don't have a sense. Simply it works better with it. 
      approximateAngleSummary += ((val + Math.pow(val/4.58, 2))/1000) * SAMPLING_INTERVAL; 

      if(approximateAngleSummary >= FLIP_RADIANS) { 
       triggerFlipDetected(); 
       clearStack(); 
       return; 
      } 
     } 
    } 

    private void clearStack() { 
     stack.clear(); 
    } 

    private void addToStack(float val) { 
     lastAdd = System.currentTimeMillis(); 
     int stackSize = stack.size(); 
     if(stackSize > 0 && ((stack.get(stackSize-1) > 0 ? 1 : -1) != (val>0?1:-1) || stackSize > STACK_MAX_SIZE)) { 
      clearStack(); 
     } 
     stack.add(val); 
    } 

    private void triggerFlipDetected() { 
     lastFlip = System.currentTimeMillis(); 

     receiver.onFlipDetected(); 
    } 

    public interface FlipEventReceiver { 
     public void onFlipDetected(); 
    } 
} 

사용법 :

public class FlipTestActivity extends Activity implements FlipEventReceiver { 

FlipListener flipListener; 
    boolean flipListenerActive = true; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_flip_test); 

    flipListener = new FlipListener(this, this); 
} 

public void onFlipDetected() { 
    // What to do when flip detected 
} 

    @Override 
protected void onResume() { 
    super.onResume(); 
    if(!flipListenerActive) { 
     flipListener.onResume(); 
     flipListenerActive = true; 
    } 
} 

    @Override 
protected void onPause() { 
    super.onPause(); 
    if(flipListenerActive) { 
     flipListener.onPause(); 
     flipListenerActive = false; 
    } 
} 

} 
+0

에 대한 좋은 튜토리얼입니다. 어느 쪽이 원하는거야? – AndyFaizan

+0

죄송합니다. 제목이 수정되었습니다. Y 축을 의미합니다. 감사. – 1daemon1

+0

[API 문서] (http://developer.android.com/reference/android/hardware/SensorManager.html#remapCoordinateSystem%28float [], % 20int, % 20int, % 20float [] % 29)를 먼저 읽어보십시오. 당신이 그것을 이해하는지보십시오. – AndyFaizan

답변

1

SensorManager 당신이 장치의 센서에 액세스 할 수있는 클래스입니다. 확인 here

Here 당신은 설명에 제목 만 Y 축 Z 축 말 센서