Wygląda na to, że potrzebujesz kodu, aby reagował tylko wtedy, gdy orientacja urządzenia zmieniła się na jedną z 4 normalnych orientacji zamiast pod każdym kątem. Spowoduje to odfiltrowanie orientacji tylko na wartości 0, 90, 180 i 270 stopni:
OrientationEventListener myOrientationEventListener;
int iOrientation;
myOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL)
{
@Override
public void onOrientationChanged(int iAngle)
{ // 0 15 30 45 60 75, 90 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345
final int iLookup[] = {0, 0, 0,90,90, 90,90, 90, 90, 180, 180, 180, 180, 180, 180, 270, 270, 270, 270, 270, 270, 0, 0, 0}; // 15-degree increments
if (iAngle != ORIENTATION_UNKNOWN)
{
int iNewOrientation = iLookup[iAngle/15];
if (iOrientation != iNewOrientation)
{
iOrientation = iNewOrientation;
// take action on new orientation here
}
}
}
};
// To display if orientation detection will work and enable it
if (myOrientationEventListener.canDetectOrientation())
{
Toast.makeText(this, "Can DetectOrientation", Toast.LENGTH_LONG).show();
myOrientationEventListener.enable();
}
else
{
Toast.makeText(this, "Can't DetectOrientation", Toast.LENGTH_LONG).show();
}
Musiałem nieco zmienić wartości odnośników, aby działał z moim sprzętem, ale to działa dobrze. Szkoda, że nie było lepszego sposobu, aby to zrobić, ale do tego czasu wykonuje swoją pracę. Dzięki! – nrflaw
Kto kiedykolwiek opublikował to jest G! Od jakiegoś czasu utknąłem na tym problemie bez pomocy metody getResources(). GetConfiguration(). – Matt