package com.videogo.ui.common; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.view.View; import android.view.View.OnClickListener; import com.videogo.widget.CheckTextButton; public class ScreenOrientationHelper implements SensorEventListener { private final static String TAG = ScreenOrientationHelper.class.getSimpleName(); private Activity mActivity; private CheckTextButton mButton1, mButton2; private int mOriginOrientation; private Boolean mPortraitOrLandscape; private SensorManager mSensorManager; private Sensor[] mSensors; private float[] mAccelerometerValues = new float[3]; private float[] mMagneticFieldValues = new float[3]; public ScreenOrientationHelper(Activity activity) { this(activity, null, null); } public ScreenOrientationHelper(Activity activity, CheckTextButton button) { this(activity, button, null); } public ScreenOrientationHelper(Activity activity, CheckTextButton button1, CheckTextButton button2) { mActivity = activity; mSensorManager = (SensorManager) mActivity.getSystemService(Context.SENSOR_SERVICE); mButton1 = button1; if (mButton1 != null) { mButton1.setEnabled(false); mButton1.setToggleEnable(false); mButton1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mSensors != null) { if (mButton1.isChecked()) portrait(); else landscape(); } } }); } mButton2 = button2; if (mButton2 != null) { mButton2.setToggleEnable(false); mButton2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mSensors != null) { if (mButton2.isChecked()) portrait(); else landscape(); } } }); } } public void enableSensorOrientation() { if (mSensors == null) { mOriginOrientation = mActivity.getRequestedOrientation(); mSensors = new Sensor[2]; mSensors[0] = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensors[1] = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); mSensorManager.registerListener(this, mSensors[0], SensorManager.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(this, mSensors[1], SensorManager.SENSOR_DELAY_NORMAL); } mButton1.setEnabled(true); } public void disableSensorOrientation(boolean reset) { if (mSensors != null) { mSensorManager.unregisterListener(this, mSensors[0]); mSensorManager.unregisterListener(this, mSensors[1]); mSensors = null; if (reset == true) { mActivity.setRequestedOrientation(mOriginOrientation); } } mButton1.setEnabled(false); } public void disableSensorOrientation() { disableSensorOrientation(true); } public void landscape() { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setButtonChecked(true); mPortraitOrLandscape = false; } public void portrait() { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setButtonChecked(false); mPortraitOrLandscape = true; } public void setButtonChecked(boolean checked) { if (mButton1 != null) mButton1.setChecked(checked); if (mButton2 != null) mButton2.setChecked(checked); } public void postOnStart() { if (mSensors != null) { mSensorManager.registerListener(this, mSensors[0], SensorManager.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(this, mSensors[1], SensorManager.SENSOR_DELAY_NORMAL); } } public void postOnStop() { if (mSensors != null) { mSensorManager.unregisterListener(this, mSensors[0]); mSensorManager.unregisterListener(this, mSensors[1]); } } private void calculateOrientation() { float[] values = new float[3]; float[] R = new float[9]; SensorManager.getRotationMatrix(R, null, mAccelerometerValues, mMagneticFieldValues); SensorManager.getOrientation(R, values); if (mSensors != null) { if (mSensors[1] == null) calculateByAccelerometer(mAccelerometerValues); else calculateByOrientation(values); } } private void calculateByAccelerometer(float[] values) { int orientation = mActivity.getRequestedOrientation(); if ((-2f < values[1] && values[1] <= 2f) && values[0] < 0) {// 向左 if (orientation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE && (mPortraitOrLandscape == null || !mPortraitOrLandscape)) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setButtonChecked(true); } if (mPortraitOrLandscape != null && !mPortraitOrLandscape) mPortraitOrLandscape = null; } else if (4f < values[1] && values[1] < 10f) { // 正南 if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && (mPortraitOrLandscape == null || mPortraitOrLandscape)) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); setButtonChecked(false); } if (mPortraitOrLandscape != null && mPortraitOrLandscape) mPortraitOrLandscape = null; } else if (-10f < values[1] && values[1] < -4f) { // 正北 if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && (mPortraitOrLandscape == null || mPortraitOrLandscape)) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setButtonChecked(false); } if (mPortraitOrLandscape != null && mPortraitOrLandscape) mPortraitOrLandscape = null; } else if ((-2f < values[1] && values[1] <= 2f) && values[0] > 0) { // 向右 if (orientation != ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE && (mPortraitOrLandscape == null || !mPortraitOrLandscape)) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); setButtonChecked(true); } if (mPortraitOrLandscape != null && !mPortraitOrLandscape) mPortraitOrLandscape = null; } } private void calculateByOrientation(float[] values) { values[0] = (float) Math.toDegrees(values[0]); values[1] = (float) Math.toDegrees(values[1]); values[2] = (float) Math.toDegrees(values[2]); int orientation = mActivity.getRequestedOrientation(); if ((-10.0f < values[1] && values[1] <= 10f) && values[2] < -40f) {// 向左 if (orientation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE && (mPortraitOrLandscape == null || !mPortraitOrLandscape)) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setButtonChecked(true); } if (mPortraitOrLandscape != null && !mPortraitOrLandscape) mPortraitOrLandscape = null; } else if (40.0f < values[1] && values[1] < 90.0f) { // 正南 if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && (mPortraitOrLandscape == null || mPortraitOrLandscape)) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); setButtonChecked(false); } if (mPortraitOrLandscape != null && mPortraitOrLandscape) mPortraitOrLandscape = null; } else if (-90.0f < values[1] && values[1] < -40.0f) { // 正北 if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && (mPortraitOrLandscape == null || mPortraitOrLandscape)) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setButtonChecked(false); } if (mPortraitOrLandscape != null && mPortraitOrLandscape) mPortraitOrLandscape = null; } else if ((-10.0f < values[1] && values[1] <= 10f) && values[2] > 40f) { // 向右 if (orientation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE && (mPortraitOrLandscape == null || !mPortraitOrLandscape)) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); setButtonChecked(true); } if (mPortraitOrLandscape != null && !mPortraitOrLandscape) mPortraitOrLandscape = null; } } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD) { mMagneticFieldValues = event.values; }else if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) { mAccelerometerValues = event.values; }else{ } calculateOrientation(); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }