4

OrientationEventListener を使用して向きを検出していますが、デフォルトでタブレットが横向きで電話が縦向きであるという問題があります。つまり、OrientationEventListener は、タブレットの縦向きの場合は 90 の値を返しますが、モバイルの縦向きの場合は 0 を返します。

私が使用しているアクティビティにはカメラがあるため、方向を変更することはできません。したがって、Orientation の値を使用して、必要に応じて画面上のいくつかの要素を再配置します。

デバイスがタブレットかどうかを検出して、それに応じて値を調整することは可能ですか? つまり、isTablet の値を計算するにはどうすればよいですか?

            if(isTablet)
            {
                orientation += -90;
                if(orientation < 0) //Check if we have gone too far back, keep the result between 0-360
                {
                    orientation += 360;
                }   
            }
4

4 に答える 4

2

向きを変えることはできないと述べたので、デバイスのプロパティを使用して、それがタブレットかどうかを判断する必要があります。

このリファレンスを見てください。

android.os.Build.DEVICE、 、android.os.Build.MODELおよびを使用android.os.Build.PRODUCTしてデバイスの ID を取得できます。この知識から、この参照を使用してそれらの値を見つけ、デバイスの種類を特定できます。

しかし、この方法を使用すると、新しいタブレットがリリースされるたびにソフトウェアを更新する必要があります。(回答のこの部分の参照としてこの質問を使用しました)。

代替は私が見つけたものです here、答えから引用:

public boolean isTablet(Context context) {
    boolean xlarge = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
    boolean large = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
    return (xlarge || large);
}

LARGE と XLARGE の画面サイズは、使用する目からの距離に基づいてメーカーによって決定されます (したがって、タブレットの概念)。

お役に立てれば!

于 2012-05-19T22:14:54.080 に答える
0

実際、私はひどいハックを使って同じ問題を解決しました (本当に恥ずかしいです :)。センサーの向きを取得したら、それを画面サイズの比率 (幅と高さ) と比較します。

ORIENTATION FROM SENSOR == ORIENTATION FROM SCREEN は電話を意味し、それ以外の場合はタブレット (またはテレビなど) を意味します。画面の比率/向きを取得するために使用するコードを次に示します (残念ながら、認識できるモードは 2 つだけです)。

int getScreenOrientation(Activity ctx)  {
  Point pt = new Point(0,0);
  try {
    Display dsp =  ctx.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
      dsp.getSize(pt);
    } else {
      pt.x = dsp.getWidth();   
      pt.y = dsp.getHeight();
    }
  return  (pt.x <= pt.y) ?  
    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
    ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
  }
  catch (Exception e) {}
  return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
}

これは向きの問題のみを解決し、タブレットかどうかは検出しません。実際のところ、私の 7 インチのタブのほとんどには向きの不一致の問題はありません。NEXUS 10 と TV アンドロイド ドングルでのみ見つかりました。

「私のようにコーディングしないでください。大丈夫です。」

ショーン

于 2013-09-21T01:06:12.483 に答える
0

デバイスの向きが変わると、アクティビティが破棄されて再作成されます。つまり、特定のイベントを実際に「聞く」必要はありません。コードを実行しているデバイスの種類に関係なく、縦向きか横向きかを知るには:

switch (yourContext.getResources().getConfiguration().orientation) {
    case Configuration.ORIENTATION_LANDSCAPE:
        //xxx
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        //xxx
        break;
}

「onCreate」はそのための良い場所かもしれません=)

于 2012-05-19T22:19:33.313 に答える