5

アクティビティの向きを一定の向きに保ちながら、センサー データを手動で操作することなく、Android デバイスの向きの変化を検出する必要があります。

onConfigurationChange私の活動が回転しないように固執するので、機能しません。

センサーデータをいじって向きの変化を検出する Androidには、デバイスの向きの変化を検出するためのアルゴリズムの実装が既に組み込まれているため、これはホイールの発明であると考えています。そして別の側面から言えば、向きの変化の検出は、このような単純なチェックではありません。

    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) {
            return;
        }
        //getResources().getConfiguration().orientation;
        if (event.values[1] < 6.5 && event.values[1] > -6.5) {
            if (orientation!=1) {
                Log.d("Sensor", "Protrait");
            }
            orientation=1;
        } else {
            if (orientation!=0) {
                Log.d("Sensor", "Landscape");
            }
            orientation=0;
        }
   }

ノイズや突然の短い揺れ/回転からのフィルタリングなど、実際のデータ処理が本当に必要です。

レガシーサービスを使用してデバイスの向きを検出する方法はありますか? (繰り返しますが、アクティビティを特定の方向に固定するため、機能しonConfigurationChangeません)

4

3 に答える 3

11

Orientation-Event の Listener があります。

ドキュメントはこちらで確認してください。

そのリスナーの実装に言及するSOの質問。

このブログの同じコード例

これがお役に立てば幸いです

于 2012-06-28T07:12:02.390 に答える
9

マニフェストでプロパティを設定すると、発射が停止するscreenOrientationため、方向の値を取得できなくなります。取得するために実装することは可能であり、角度を計算して方向を計算することはできますが、そのようなタスクには少し複雑でやり過ぎです。私が見つけた最良の解決策は、次のコードを使用することです。次のコードは、向きの変更時に回転値を更新します。値は、回転角度に応じて 0 から 4 です。onConfigurationChangedSensorEventListenerPitchrollyawOrientationEventListener

private OrientationEventListener listener;
private int rotation;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    listener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) {
        @Override
        public void onOrientationChanged(int orientation) {
            rotation = ((orientation + 45) / 90) % 4;
        }
    };
    if (listener.canDetectOrientation()) listener.enable();
    else listener = null; // Orientation detection not supported
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (listener != null) listener.disable();
}
于 2015-08-19T15:20:10.653 に答える
6

私のアクティビティは常に縦向きモードに設定されています。このコードを onCreate に配置します。

    myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) {
        public void onOrientationChanged(int arg0) {
            if (arg0>=315 || arg0<45){
                currentOrientation = Surface.ROTATION_90;
            }else if (arg0>=45 && arg0<135){
                currentOrientation = Surface.ROTATION_180;
            }else if (arg0>=135 && arg0<225){
                currentOrientation = Surface.ROTATION_270;
            }else if (arg0>=225 && arg0<315){
                currentOrientation = Surface.ROTATION_0;
            }
        }
    };
于 2014-01-17T17:43:33.013 に答える