2012-05-10 14 views
0

画面の向きに問題があります。基本的に私がやろうとしているのは、正確な画面の向き(逆の風景と逆の肖像画を含む)を決定することです。私はそれを私のためにやるために以下のメソッドを書いたが、私のトランスフォーマでは完全に動作するようだが、私がエミュレータで同じコードを開始すると、いくつかのことが混乱する。Android 2.2以降で画面の向きを検出する

基本的に何が起きているのかは、エミュレータではドキュメントに従ってランドスケープ(ROTATION_90)に切り替えると、逆のランドスケープになっているはずです(Androidドキュメントで説明されているようにROTATION_90デバイスは逆のポートレートです)。残念なことに何らかの理由でエミュレータで正常なランドスケープモードと思われます。

私の質問は、以下のこのコードが正しいことです。問題はそれにあります。あるいは、私はいくつかの他のパラメータを考慮していないかもしれません(例えば、エミュレータには加速度センサーがほとんどないなど)。

public static int getDeviceCurrentOrientation() { 

    WindowManager lWindowManager = (WindowManager) getContext() 
      .getSystemService(Activity.WINDOW_SERVICE); 

    Configuration cfg = getContext().getResources().getConfiguration(); 
    int lRotation = lWindowManager.getDefaultDisplay().getRotation(); 

    int rotation1; 
    int orientation; 

    rotation1 = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 
    if (cfg.orientation == Configuration.ORIENTATION_LANDSCAPE) 
     rotation1 = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
    else if (cfg.orientation == Configuration.ORIENTATION_PORTRAIT) 
     rotation1 = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
    else 
     rotation1 = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 

    switch (lRotation) { 
    case Surface.ROTATION_0: 
     orientation = 0; 
     break; 
    case Surface.ROTATION_90: 
     orientation = 1; 
     break; 
    case Surface.ROTATION_180: 
     orientation = 2; 
     break; 
    case Surface.ROTATION_270: 
     orientation = 3; 
     break; 
    default: 
     orientation = -1; 
    } 

    if ((orientation == 0) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)) 
     return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 

    if ((orientation == 0) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) 
     return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 

    if ((orientation == 1) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) 
     return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 

    if ((orientation == 1) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)) 
     return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 

    if ((orientation == 2) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) 
     return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 

    if ((orientation == 2) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)) 
     return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 

    if ((orientation == 3) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)) 
     return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 

    if ((orientation == 3) 
      && (rotation1 == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)) 
     return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 

    return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 
} 
+0

を見つけました変数:-)また、エミュレータと私のタブレットはどちらもAndroid 4.0.3で動作します。 – alter83

+0

エミュレータでは、API 8とAPI 10を試しました。2.2でエミュレータを使用した場合、このコードは意図したとおりに動作しましたが、2.3.3では同じ問題が発生しました。 – alter83

+0

どのようなエラーメッセージが表示されているか教えてください。 logcatの出力とは何ですか? –

答えて

2
私は同様の問題があった

とクランチの時間後......
は、私はおそらく私が名前の向きや回転のために台無しにすることを知っていることを追加する必要がありますthis nice solution >>

Display display = getWindowManager().getDefaultDisplay(); 
int rotation = display.getRotation(); 

Point size = new Point(); 
display.getSize(size); 

int lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 

if (rotation == Surface.ROTATION_0 
     || rotation == Surface.ROTATION_180) { 
    // if rotation is 0 or 180 and width is greater than height, we have 
    // a tablet 
    if (size.x > size.y) { 
     if (rotation == Surface.ROTATION_0) { 
      lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
     } else { 
      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
     } 
    } else { 
     // we have a phone 
     if (rotation == Surface.ROTATION_0) { 
      lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
     } else { 
      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     } 
    } 
} else { 
    // if rotation is 90 or 270 and width is greater than height, we 
    // have a phone 
    if (size.x > size.y) { 
     if (rotation == Surface.ROTATION_90) { 
      lock = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
     } else { 
      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
     } 
    } else { 
     // we have a tablet 
     if (rotation == Surface.ROTATION_90) { 
      lock = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     } else { 
      lock = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
     } 
    } 
} 
関連する問題