2016-12-15 4 views
2

ich auf ein Problem gekommen, wo die Orientierung sensorPortrait nicht funktioniert, habe ich versucht haben, so dass sowohl durch das Manifest und in der Tätigkeit selbst mitAndroid - ‚sensorPortrait‘ Orientierung nicht funktioniert

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 

Aber dies scheint nur im normalen Portrait-Modus gesperrt werden, aber wenn ich versuche, `fullSensor‘

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 

, die nach dem docs

Die Ausrichtung wird durch den Sensor für die Geräteausrichtung für jede der vier Orientierungen bestimmt. Dies ist ähnlich wie bei "Sensor", außer dass dies jede der 4 möglichen Bildschirmausrichtungen erlaubt, unabhängig davon, was das Gerät normalerweise tun wird (zum Beispiel werden manche Geräte normalerweise kein umgekehrtes Hochformat oder umgekehrtes Querformat verwenden, aber dies ermöglicht diese). Hinzugefügt in API-Ebene 9.

und es tut genau das, alle 4 Ausrichtungen sind möglich. Wenn ich versuche, auch

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 

Ich bin in der Lage Reverse-Porträt zu erreichen, die mich zurück zu meiner ursprünglichen Frage führt, warum sensorPortrait nicht? Es sieht aus wie es hat etwas

unabhängig von ‚für` fullSensor mit dieser Linie von der Dokumentation zu tun, was das Gerät normalerweise tun (zum Beispiel werden einige Geräte normalerweise nicht verwenden Reverse Hoch- oder Querumzukehren, aber dies ermöglicht es den)

So wie aktiviere ich es, ist das möglich und warum fullSensor scheint es außer Kraft zu setzen, aber nicht sensorPortrait? Ich kann nicht erwähnen, wie das geht. Diese question schlägt vor, dass die PhoneWindowManager dafür verantwortlich ist.

Ist die ideale Lösung, um einfach eine OrientationEventListener() zu erstellen und manuell setRequestedOrientation() manuell aufzurufen, abhängig von den über onOrientationChanged(int orientation) zurückgegebenen Werten?

Antwort

2

Als Arbeit um, ich habe eine SensorPortraitActivity erstellt:

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 
    } 
} 

Obwohl es wie viel des Guten für etwas so einfaches wie dies scheint.

Um es einfach 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

Dies ist die einzige Lösung zu verwenden, die für dieses Problem, das ich gesehen habe, wirklich funktioniert. Habe jetzt selbst eine ähnliche Sache gemacht, da SensorPortrait einfach nicht das tut, was von ihm erwartet wird! Dies scheint auch schneller auf Rotation zu reagieren, was ein Bonus ist. Danke für das Teilen. – WillEllis

Verwandte Themen