4

Androidの向きに問題があります。デバイスの向きは、AndroidManifest.xml ファイルで設定した横向きです。

android:screenOrientation="landscape"

また、私はデバイスを横向きに持っているので、すべて (レイアウト、ビューなど) は私が望んでいたように横向きモードになっています。ただし、デバイスを縦向きに持っている場合にのみ、必要な値が得られます。

インターネットからいくつかのコードを変更したところ、HTC 3d EVO、Nexus 7、Samsung Galaxy S3 では機能しますが、Galaxy Tablet 10 では機能しません。

この投稿を見つけました。 Androidの向きセンサーはデバイスごとに異なりますか? 受け入れられた答えは、 getRotation() および remapCoordinateSystem() メソッドを使用することを提案していますが、その方法については言及していません。

これが私が終わった方法です。

        SensorManager.getRotationMatrix(Rmat, Imat, gData, mData);
        SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2);
        // Orientation isn't as useful as a rotation matrix, but
        // we'll show it here anyway.
        SensorManager.getOrientation(R2, orientation);
        float incl = SensorManager.getInclination(Imat);

        FontTextView pitchText = (FontTextView)findViewById(R.id.pitch_text);

        if((int)(orientation[1]*90) <= -110 && !newQuestionIsActive) {
            newQuestionIsActive = true;
            pitchText.setText("Bring new question");
        }
        else if(Math.abs((int)(orientation[2]*90)) <= 200 && (int)(orientation[1]*90) >= -30 && newQuestionIsActive) {
            newQuestionIsActive = false;
            pitchText.setText("Not Correct!");
        }
        else if(Math.abs((int)(orientation[2]*90)) > 200 && (int)(orientation[1]*90) >= -30 && newQuestionIsActive) {
            newQuestionIsActive = false;
            pitchText.setText("Congratulations!");
        }

さて、このコードで getRotation() をどのように利用すればよいでしょうか? 上記の 3 つのデバイスは正常に動作するが、Galaxy タブレットでは動作しない理由を簡単に説明していただければ幸いです。

この問題について Android のドキュメントには次のように書かれています。

最後に、アプリケーションがセンサー データを画面上の表示と照合する場合は、getRotation() メソッドを使用して画面の回転を決定し、次に remapCoordinateSystem() メソッドを使用してセンサー座標を画面座標にマップする必要があります。マニフェストで縦向きのみの表示が指定されている場合でも、これを行う必要があります。

http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html

4

2 に答える 2

13

解決策を見つけました。

この問題は、一部の新しいデバイスのデフォルトの向きが横向きに設定され、他のデバイスが縦向きに設定されていることが原因で発生します。そのため、センサー マネージャーはそれに応じて動作します。センサー マネージャーを期待どおりに動作させるには、デバイスの defaultDisplayRotation を検出し、remapCoordinateSystem() パラメーター ロジックを変更する必要があります。

私は変わりました

SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2);

int rotation = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
if(rotation == 0) // Default display rotation is portrait
    SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_Y, R2);
else   // Default display rotation is landscape
    SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2);

今では動作します...これが他の誰かに役立つことを願っています!

于 2013-06-26T15:28:20.763 に答える