2014-02-19 4 views
0

Мне нужно потянуть ориентацию телефона как целое число от 1-360 без использования OrientationEventListener для проверки onOrientationChanged()android - как я могу получить текущую ориентацию?

Можно ли это сделать? Я немного поработал над Googling и далеко не ушел.

Благодаря

+0

см [Проверка ориентации на телефон Android] (http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone) – ddz

+0

Пейзаж/Портрет отличается от угла поворота. Нет никакого «легкого» способа получить точный угол, и наилучшие способы включают использование датчиков. Если вы в порядке с 0/90/180/270, вы можете использовать 'Display.getRotation()'. – Geobits

+0

@ Гебиц посмотрел на это. На самом деле было бы полезно, если бы моя активность не была закрыта для портрета:/ – 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); 
    } 
} 

Что касается того, что угол, чтобы принять, что это может помочь:

Азимут (степень вращения вокруг оси г). Это угол между магнитным севером и осью y устройства. Например, если ось y выровнена с магнитным севером, это значение равно 0, и если ось y устройства указывает на юг, это значение равно 180. Аналогично, , когда ось y указывает на восток, это значение равно 90 и когда это указание на запад это значение составляет 270.

Pitch (градусы поворота вокруг оси x). Это значение положительно, когда положительная ось z вращается в направлении положительной оси y, и отрицательна, когда положительная ось z вращается в направлении отрицательной оси y . Диапазон значений от 180 до -180 градусов.

Roll (градусы поворота вокруг оси y). Это значение положительно, когда положительная ось z вращается в направлении положительной оси x, и отрицательна, когда положительная ось z вращается в направлении отрицательной оси x . Диапазон значений составляет от 90 до 90 градусов.

Ссылка:
http://www.vogella.com/tutorials/AndroidSensor/article.html
http://developer.android.com/guide/topics/sensors/sensors_position.html

0

Я получил от этого класса SensorManager. Если это помогает, here.

общественность статического поплавок [] GetOrientation (плавать [] R, плавать [] значение)

Добавлен в уровне API 3 вычисляет ориентацию устройства, основанную на матрице вращения.

Когда он возвращает значение массива заполняется результат:

значения [0]: азимут, вращение вокруг оси Z. значения 1: шаг, вращение вокруг оси X. значения [2]: рулон, вращение вокруг оси Y. Используемая эталонная система координат отличается от мировой системы координат, определенной для матрицы вращения:

X определяется как векторное произведение YZ (оно касательно к земле в текущем местоположении устройства и примерно на Западе) , Y является касательным к земле в текущем местоположении устройства и указывает на магнитный Северный полюс. Z указывает на центр Земли и перпендикулярно земле. Диаграмма координат системы инвертированного мира. Все три угла сверху находятся в радианах и положительны в направлении против часовой стрелки.

Параметры R матрица вращения см. GetRotationMatrix (float [], float [], float [], float []). присваивает массив из 3 поплавков для хранения результата. Возвращает Значения массива, переданные как аргумент.

Смежные вопросы