OrientationEventListener를 사용하지 않고 1-350의 정수로 전화 방향을 잡아 당겨 onOrientationChanged()를 확인해야합니다.android - 어떻게 현재 방향을 얻을 수 있습니까?
이 작업을 수행 할 수 있습니까? 나는 인터넷 검색의 좋은 일을하고 멀리 얻지 못했습니다.
감사합니다.
OrientationEventListener를 사용하지 않고 1-350의 정수로 전화 방향을 잡아 당겨 onOrientationChanged()를 확인해야합니다.android - 어떻게 현재 방향을 얻을 수 있습니까?
이 작업을 수행 할 수 있습니까? 나는 인터넷 검색의 좋은 일을하고 멀리 얻지 못했습니다.
감사합니다.
정확한 각도를 얻으려면 가속도계를 사용해야 할 수도 있습니다. 다음은 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
나는 이것을 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 배열 값이 인수로 전달되었습니다.
[안드로이드 전화에 대한 방향을 점검] 참조 (http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone) – ddz
풍경/Portrait는 회전 각도와 완전히 다릅니다. 정확한 각도를 얻는 "쉬운"방법은 없으며 가장 좋은 방법은 센서 사용과 관련이 있습니다. 0/90/180/270으로 괜찮 으면'Display.getRotation()'을 사용할 수 있습니다. – Geobits
@ Geitits는 그것을 보았다. 내 활동이 세로 방향으로 고정되어 있지 않으면 실제로 유용 할 것입니다 :/ – Rob