2016-12-15 5 views
2

я сталкивался с проблемой, где ориентация sensorPortrait не работает, я попробовал позволяет как через манифеста и в самой деятельности сAndroid - ориентация «sensorPortrait» не работает

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 

Но это, кажется, просто быть заблокирован в обычном портретном режиме, однако, если я попробовать `fullSensor»

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 

, которые в соответствии с Документами

Ориентация определяется датчиком ориентации устройства для любой из 4 ориентаций. Это похоже на «датчик», за исключением того, что это позволяет использовать любую из 4 возможных ориентаций экрана, независимо от того, что обычно будет делать устройство (например, некоторые устройства обычно не используют обратную портретную или обратную панораму, но это позволяет этим). Добавлено в API уровне 9.

и он делает именно это, все 4 ориентации возможны. Если я попробовать

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 

Я смог добиться обратного портрет, который ведет меня обратно к моему первоначальному вопросу, почему sensorPortrait не работает? Похоже, что-то делать с этой строкой из документации для `fullSensor»

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

Так как же я включить его, что возможно и почему fullSensor кажется, переопределить его, но не sensorPortrait? Кажется, я не могу найти упоминания о том, как это сделать. Это question предполагает, что за это отвечает PhoneWindowManager.

Является идеальным решением только для создания OrientationEventListener() и вручную вызывает setRequestedOrientation() вручную в зависимости от значений, возвращаемых через onOrientationChanged(int orientation)?

ответ

2

В работе вокруг я создал SensorPortraitActivity:

public class SensorPortraitActivity extends AppCompatActivity { 

    private static final int PORTRAIT = 0; 
    private static final int REVERSE_PORTRAIT = 180; 
    private static final int OFFSET = 45; 
    private static final int UNKNOWN = -1; 

// account for 0 = 360 (eg. -1 = 359) 
    private static final int PORTRAIT_START = PORTRAIT - OFFSET + 360; 
    private static final int PORTRAIT_END = PORTRAIT + OFFSET; 
    private static final int REVERSE_PORTRAIT_START = REVERSE_PORTRAIT - OFFSET; 
    private static final int REVERSE_PORTRAIT_END = REVERSE_PORTRAIT + OFFSET; 

    private OrientationChangeListener mListener; 
    private OrientationEventListener mOrientationListener; 
    private CurrentOrientation mCurrentOrientation; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mOrientationListener = new OrientationEventListener(this) { 
      @Override 
      public void onOrientationChanged(int i) { 
       orientationChanged(i); 
      } 
     }; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mOrientationListener.enable(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mOrientationListener.disable(); 
    } 

    //optional 
    public void setOrientationChangeListener(OrientationChangeListener listener){ 
     mListener = listener; 
    } 

    private void orientationChanged(int degrees) { 

     if (degrees != UNKNOWN){ 

      if (degrees >= PORTRAIT_START || degrees <= PORTRAIT_END){ 

       if (mCurrentOrientation != CurrentOrientation.PORTRAIT){ 

        mCurrentOrientation = CurrentOrientation.PORTRAIT; 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

       if (mListener != null){ 
        mListener.onPortrait(); 
       } 
      } 
     } else if (degrees >= REVERSE_PORTRAIT_START && degrees <= REVERSE_PORTRAIT_END){ 

      if (mCurrentOrientation != CurrentOrientation.REVERSE_PORTRAIT){ 

       mCurrentOrientation = CurrentOrientation.REVERSE_PORTRAIT; 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 

        if (mListener != null) { 
         mListener.onReversePortrait(); 
        } 
       } 
      } 
     } 
    } 

    interface OrientationChangeListener { 
     void onPortrait(); 
     void onReversePortrait(); 
    } 

    enum CurrentOrientation { 
     PORTRAIT, REVERSE_PORTRAIT 
    } 
} 

Хотя это кажется излишним для чего-то же просто, как это.

Чтобы использовать это просто extend SensorPortraitActivity

public class ExampleActivity extends SensorPortraitActivity implements SensorPortraitView.OrientationChangeListener { 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //set listener if you want callbacks 
     super.setOrientationChangeListener(this); 
    } 

    @Override 
    public void onPortrait() { 
     //portrait orientation 
    } 

    @Override 
    public void onReversePortrait() { 
     //reverse portrait orientation 
    } 
} 
+0

Это единственное решение, которое действительно работает для этого вопроса, который я видел. Сделали то же самое, что и сейчас, поскольку sensorPortrait просто не делает того, чего от него ожидают! Это также, похоже, быстрее реагирует на ротацию, и это бонус. Спасибо, что поделился. – WillEllis

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