7

説明

カメラのプレビューをサーフェスビューに表示するアクティビティがあります。向きが変わったときに再起動したくないので(QRコードを常にスキャンしているため)、向きは縦向きにロックされます。

私が抱えている問題は、画面の下部にあるユーザーに画面に指示を表示する必要があることです。画面が1つの向きでロックされている場合、アクティビティが再描画されないため、新しい向きの通知は届きません。したがって、電話が縦向き、逆向きの縦向き、横向き、または崇拝されている横向きであるかどうかに関係なく、指示は同じ場所にレンダリングされました。

この問題に対処するために、センサーマネージャーに接続して、オリエンテーションをリアルタイムで読み取りました。(以下のコードを参照してください)それを読んだ後、私は自分でオリエンテーションを理解し、更新が送信されるたびに必要に応じて指示を移動します。これは最近まで私のために働いてきました。AsusTransformerPrimeおよびXoomタブレットでテストする場合。タブレットは、他の2台の電話のように「0」ではなく、縦向きの向きを「90」として返します。以下のコードでわかるように、タブレット(大画面)をチェックし、余分な90度を差し引いています。

問題

問題は、新しいNexus7タブレットにこの余分なバイアスがないことです。縦向きでは「0」を返しますが、タブレットとして検出したため、マイナス90度であるため、結果は270になり、タブレットが横向きモードであるかのように指示が表示されます。この背後にある理由は、Xoom / Transformerが横向きで、Nexusが縦向きで使用するように設計されていることだと思いますが、影響を受けるすべてのデバイスについて知らない限り、これは役に立ちません。

質問

以下のコードのように、すべてのデバイスの向きを検出して結果を「リアルタイム」で返す信頼できる方法はありますが、デバイスのデフォルトの向きを考慮に入れています(つまり、電話+ Nexus 7は縦向きですが、ほとんどのタブレットは風景)?

現在のコード

    boolean large = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
    boolean xlarge = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);       
    isTablet = large || xlarge;
    myOrientationEventListener = new OrientationEventListener(getBaseContext(), SensorManager.SENSOR_DELAY_NORMAL)
    {

        @Override
        public void onOrientationChanged(int orientation)
        {
            if (orientation == -1)
            {
                return;
            }

            if (isTablet)
            {
                orientation += -90;
                if (orientation < 0) // keep the result between 0-360
                {
                    orientation += 360;
                }
            }

            // Work out the orientation

            if (orientation >= 60 && orientation <= 140)
            {
                screenOrientation = ScreenOrientation.Landscape_Reversed;
            }
            else if (orientation >= 140 && orientation <= 220)
            {
                screenOrientation = ScreenOrientation.Portrait_Reversed;
            }
            else if (orientation >= 220 && orientation <= 300)
            {
                screenOrientation = ScreenOrientation.Landscape;
            }
            else
            {
                screenOrientation = ScreenOrientation.Portrait;
            }

            //... Do stuff with new orientation here
        }
    };
4

1 に答える 1

6

修正しました

コードを置き換えました

        if (isTablet)
        {
            orientation += -90;
            if (orientation < 0) // keep the result between 0-360
            {
                orientation += 360;
            }
        }

以下で

            //Check "normal" screen orientation and adjust accordingly
            int naturalOrientation = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
            if (naturalOrientation == Surface.ROTATION_0)
            {
                Logging.d(TAG, "Rotation ROTATION_0");
            }
            else if (naturalOrientation == Surface.ROTATION_90)
            {
                Logging.d(TAG, "Rotation ROTATION_90");
                orientation += 90;
            }
            else if (naturalOrientation == Surface.ROTATION_180)
            {
                Logging.d(TAG, "Rotation ROTATION_180");
                orientation += 180;
            }
            else if (naturalOrientation == Surface.ROTATION_270)
            {
                Logging.d(TAG, "Rotation ROTATION_270");
                orientation += 270;
            }

            if (orientation > 360) // Check if we have gone too far forward with rotation adjustment, keep the result between 0-360
            {
                orientation -= 360;
            }
于 2012-08-31T14:29:44.983 に答える