Ориентация от Android Акселерометр - PullRequest
13 голосов
/ 04 мая 2011

Я тестировал выход акселерометра на 2 разных устройствах (Elocity A7 и Archos 7 Home tablet), но датчик, похоже, дает разные результаты. Я запрограммировал его на альбомный режим, но оси X и Y, кажется, противоположны между двумя устройствами. Ось X возвращает 10, когда удерживается перпендикулярно земле, а ось Archos X возвращает 0. Планшет Elocity - это Android 2.2, а Archos - 2,1. Может кто-нибудь указать мне правильное направление, как получить ориентацию от акселерометра в синхронизации между этими двумя устройствами?

Ответы [ 4 ]

15 голосов
/ 14 января 2013

Фактически оси акселерометра относятся к ориентации устройства по умолчанию.

Вот как с этим справиться:

static void canonicalOrientationToScreenOrientation(
         int displayRotation, float[] canVec, float[] screenVec) 
{ 
    final int axisSwap[][] = { 
    {  1,  -1,  0,  1  },     // ROTATION_0 
    {-1,  -1,  1,  0  },     // ROTATION_90 
    {-1,    1,  0,  1  },     // ROTATION_180 
    {  1,    1,  1,  0  }  }; // ROTATION_270 

    final int[] as = axisSwap[displayRotation]; 
    screenVec[0]  =  (float)as[0] * canVec[ as[2] ]; 
    screenVec[1]  =  (float)as[1] * canVec[ as[3] ]; 
    screenVec[2]  =  canVec[2]; 
} 

Это решение было предоставлено NVidia.Проверьте их белую бумагу об Android Accelerometer для более подробной информации.

11 голосов
/ 21 марта 2013

просто хотел добавить что-то к ответу Хартока, так как сначала я не мог этого понять ...

Я переписал метод так:

public static float[] adjustAccelOrientation(int displayRotation, float[] eventValues) 
{ 
    float[] adjustedValues = new float[3];

    final int axisSwap[][] = {
    {  1,  -1,  0,  1  },     // ROTATION_0 
    {-1,  -1,  1,  0  },     // ROTATION_90 
    {-1,    1,  0,  1  },     // ROTATION_180 
    {  1,    1,  1,  0  }  }; // ROTATION_270 

    final int[] as = axisSwap[displayRotation]; 
    adjustedValues[0]  =  (float)as[0] * eventValues[ as[2] ]; 
    adjustedValues[1]  =  (float)as[1] * eventValues[ as[3] ]; 
    adjustedValues[2]  =  eventValues[2];

    return adjustedValues;
}

Точно такой жевещь, просто с более дружественными именами переменных, и я воссоздаю float внутри, потому что мне это нужно было вот так ... Просто вызовите эту функцию, вставьте getRotation и массив float event.values, проверьте значения его возвращаемого массива float ивыберите любой номер, который вы предпочитаете ...

Надеюсь, это кому-нибудь поможет!

7 голосов
/ 22 августа 2011

Насколько я знаю, это из-за ориентации устройства по умолчанию.Например, новые планшеты с Android и Honeycomb имеют книжную ориентацию, когда их держат, как в альбомной ориентации на телефонах.

http://developer.android.com/reference/android/hardware/SensorEvent.html

В документации по Android есть информация, которая:

Система координат определяется относительно экрана телефона в его ориентации по умолчанию.Оси не меняются при изменении ориентации экрана устройства.

Ось X горизонтальна и направлена ​​вправо, ось Y вертикальна и направлена ​​вверх, а ось Z направлена ​​к внешней стороне передней граниэкран.В этой системе координаты позади экрана имеют отрицательные значения Z.

Может быть, у одного из этих устройств также есть альбомная ориентация в книжной (по умолчанию) ориентации?

Надеюсь, это вам как-то поможет.

4 голосов
/ 06 мая 2012

Как указано выше, ориентация экрана по умолчанию может варьироваться от устройства к устройству.Координаты акселерометра всегда будут соответствовать ориентации устройства по умолчанию.Это поведение отличается для экранных координат.Когда устройство вращается, координаты экрана также вращаются, так что (0, 0) всегда является текущим верхним левым углом экрана.На устройстве с ориентацией портрета по умолчанию блокировка ориентации на портрет обеспечит, чтобы координаты датчика проходили вдоль той же оси, что и координаты экрана, независимо от поворота.С другой стороны, привязка ориентации экрана к портретной ориентации на устройстве с альбомной ориентацией по умолчанию приведет к тому, что ось датчика будет двигаться в направлении, отличном от оси экрана.

Эта статья: http://android-developers.blogspot.com/2010/09/one-screen-turn-deserved-another.html объясняет это более подробно, а также дает решение для решения проблемы.

...