1

Я хотел бы определить ориентацию экрана устройства, реализовав SensorEventListener, поскольку его текущая ориентация экрана по умолчанию установлена ​​на портрет. Мне нужно сделать это, потому что в моем макете есть несколько кнопок, которые должны вращаться независимо от их макета, и единственный способ сделать это (пока я знаю), переопределяя onConfigurationChanged и добавляя соответствующую анимацию к каждой ориентации экрана. Я не думаю, что OrientationEventListener будет работать, поскольку установленная ориентация привязана к портрету. Итак, как я могу получить ориентацию экрана или угловые повороты от самого датчика?Как определить ориентацию устройства с помощью SensorEventListener?

+0

Смотрите мой ответ на http://stackoverflow.com/questions/32826227/how-to-determine-device-orientation-from-the- датчики/32837770 # 32837770. –

+0

Это не то, что мне нужно. Мне нужно определить движение устройства для поворота кнопок в зависимости от него. Макет остается изображенным как есть. –

+0

Что вы подразумеваете под движением устройства? Если устройство не плоское, вы можете использовать ссылку выше, чтобы получить угол, который скажет вам, в какой ориентации находится экран устройства. Вы можете протестировать, не установив активность в портретный режим, а затем поверните экран, чтобы увидеть, под каким углом он переключится на пейзаж. Он может быть зависимым от устройства. –

ответ

2

OrientationEventListener будет работать даже при фиксированной ориентации; см. https://stackoverflow.com/a/8260007/1382108. Он контролирует датчик в соответствии с документацией. Допустим, вы определите следующие константы:

private static final int THRESHOLD = 40; 
public static final int PORTRAIT = 0; 
public static final int LANDSCAPE = 270; 
public static final int REVERSE_PORTRAIT = 180; 
public static final int REVERSE_LANDSCAPE = 90; 
private int lastRotatedTo = 0; 

Цифры соответствуют тому, что возвращается OrientationEventListener, поэтому если у вас есть природный ландшафт устройства (планшета), вы должны принять это во внимание, см How to check device natural (default) orientation on Android (i.e. get landscape for e.g., Motorola Charm or Flipout).

@Override 
public void onOrientationChanged(int orientation) { 
    int newRotateTo = lastRotatedTo; 
    if(orientation >= 360 + PORTRAIT - THRESHOLD && orientation < 360 || 
      orientation >= 0 && orientation <= PORTRAIT + THRESHOLD) 
     newRotateTo = 0; 
    else if(orientation >= LANDSCAPE - THRESHOLD && orientation <= LANDSCAPE + THRESHOLD) 
     newRotateTo = 90; 
    else if(orientation >= REVERSE_PORTRAIT - THRESHOLD && orientation <= REVERSE_PORTRAIT + THRESHOLD) 
     newRotateTo = 180; 
    else if(orientation >= REVERSE_LANDSCAPE - THRESHOLD && orientation <= REVERSE_LANDSCAPE + THRESHOLD) 
     newRotateTo = -90; 
    if(newRotateTo != lastRotatedTo) { 
     rotateButtons(lastRotatedTo, newRotateTo); 
     lastRotatedTo = newRotateTo; 
    } 
} 

В rotateButtons функции нечто вроде:

public void rotateButtons(int from, int to) { 

    int buttons[] = {R.id.buttonA, R.id.buttonB}; 
    for(int i = 0; i < buttons.length; i++) { 
     RotateAnimation rotateAnimation = new RotateAnimation(from, to, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
     rotateAnimation.setInterpolator(new LinearInterpolator()); 
     rotateAnimation.setDuration(200); 
     rotateAnimation.setFillAfter(true); 
     View v = findViewById(buttons[i]); 
     if(v != null) { 
      v.startAnimation(rotateAnimation); 
     } 
    } 
}