2014-02-19 3 views
0

OrientationEventListener를 사용하지 않고 1-350의 정수로 전화 방향을 잡아 당겨 onOrientationChanged()를 확인해야합니다.android - 어떻게 현재 방향을 얻을 수 있습니까?

이 작업을 수행 할 수 있습니까? 나는 인터넷 검색의 좋은 일을하고 멀리 얻지 못했습니다.

감사합니다.

+0

[안드로이드 전화에 대한 방향을 점검] 참조 (http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone) – ddz

+0

풍경/Portrait는 회전 각도와 완전히 다릅니다. 정확한 각도를 얻는 "쉬운"방법은 없으며 가장 좋은 방법은 센서 사용과 관련이 있습니다. 0/90/180/270으로 괜찮 으면'Display.getRotation()'을 사용할 수 있습니다. – Geobits

+0

@ Geitits는 그것을 보았다. 내 활동이 세로 방향으로 고정되어 있지 않으면 실제로 유용 할 것입니다 :/ – Rob

답변

3

정확한 각도를 얻으려면 가속도계를 사용해야 할 수도 있습니다. 다음은 Vogella에서 찍은 :

public class SensorTestActivity extends Activity implements SensorEventListener { 
    private SensorManager sensorManager; 
    private boolean color = false; 
    private View view; 
    private long lastUpdate; 


/** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    view = findViewById(R.id.textView); 
    view.setBackgroundColor(Color.GREEN); 

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    lastUpdate = System.currentTimeMillis(); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     getAccelerometer(event); 
    } 

    } 

    private void getAccelerometer(SensorEvent event) { 
    float[] values = event.values; 
    // Movement 
    float x = values[0]; 
    float y = values[1]; 
    float z = values[2]; 

    float accelationSquareRoot = (x * x + y * y + z * z) 
     /(SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH); 
    long actualTime = System.currentTimeMillis(); 
    if (accelationSquareRoot >= 2) // 
    { 
     if (actualTime - lastUpdate < 200) { 
     return; 
     } 
     lastUpdate = actualTime; 
     Toast.makeText(this, "Device was shuffed", Toast.LENGTH_SHORT) 
      .show(); 
     if (color) { 
     view.setBackgroundColor(Color.GREEN); 

     } else { 
     view.setBackgroundColor(Color.RED); 
     } 
     color = !color; 
    } 
    } 

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

    } 

    @Override 
    protected void onResume() { 
    super.onResume(); 
    // register this class as a listener for the orientation and 
    // accelerometer sensors 
    sensorManager.registerListener(this, 
     sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
     SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    @Override 
    protected void onPause() { 
    // unregister listener 
    super.onPause(); 
    sensorManager.unregisterListener(this); 
    } 
} 

취할 각도,이 도움이 될 :

방위각 (회전의 정도를 z 축 주위). 자북과 장치의 y 축 사이의 각도는 입니다. 예를 들어 장치의 y 축이 자기 북쪽에 정렬 된 경우이 값은 0이고 장치의 y 축이 남쪽 인 경우 인 경우이 값은 180입니다. 마찬가지로 y 축이이 값을 동쪽으로 가리키면 이이 값을 가리킬 때 이 서쪽을 가리키는 은 270입니다.

피치 (x 축을 중심으로 한 회전 각도)입니다. 이 값은 양의 z 축이 양의 y 축 방향으로 회전 할 때 양수 ( )이며, 양의 z 축이 음의 y 축인 쪽으로 회전하면 양수입니다. 값의 범위는 180도 -180도입니다.

(y 축을 중심으로 한 회전 각도). 이 값은 양의 z 축이 양의 x 축 방향으로 회전 할 때 양수이고, 양수 z 축이 음의 x 축인 을 향해 회전하면 양수입니다 (양수 x 축은 ). 값의 범위는 90도 ~ -90도입니다.

참조 :
http://www.vogella.com/tutorials/AndroidSensor/article.html
http://developer.android.com/guide/topics/sensors/sensors_position.html

0

나는 이것을 SensorManager 클래스에서 가져 왔습니다. 도움이된다면, here입니다.

공용 static 플로트 [] getOrientation

라이트 API 레벨 3 이 회전 행렬에 기초하여 상기 장치의 방향을 계산에서 ([]의 값을 부동 [] R 플로트).

가 반환

, 상기 배열 값을 결과로 채워진다 :

값 [0] : Z 축 주위의 방위각 회전. 값 1 : 피치, X 축을 중심으로 한 회전. 값 [2] : 롤, Y 축을 중심으로 회전. 사용되는 참조 좌표계가 회전 행렬에 대해 정의 된 세계 좌표계와 다릅니다.

X는 벡터 곱 YZ로 정의됩니다 (장치의 현재 위치에서 접선이며 서쪽을 대략 나타냄) . Y는 장치의 현재 위치에서 접지에 접선이며 자기 북극을 향합니다. Z는 지구 중심을 향하고지면에 수직입니다. 거꾸로 된 세계 좌표계 다이어그램. 위 세 개의 각은 라디안으로 표시되며 시계 반대 방향으로 양수입니다.

매개 변수 R 회전 행렬 getRotationMatrix (float [], float [], float [], float [])를 참조하십시오. 값은 결과를 저장하는 3 개의 부동 소수점 배열입니다. Returns 배열 값이 인수로 전달되었습니다.

관련 문제