ChangeOrientationHandler.java
public class ChangeOrientationHandler extends Handler {
private Activity activity;
public ChangeOrientationHandler(Activity ac) { super(); activity = ac; } @Override public void handleMessage(Message msg) { if (msg.what == 888) { int orientation = msg.arg1; if (orientation > 45 && orientation < 135) { activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE); // Log.d(MainActivity.TAG, "横屏翻转: "); } else if (orientation > 135 && orientation < 225) { activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT); // Log.d(MainActivity.TAG, "竖屏翻转: "); } else if (orientation > 225 && orientation < 315) { activity.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE); // Log.d(MainActivity.TAG, "横屏: "); } else if ((orientation > 315 && orientation < 360) || (orientation > 0 && orientation < 45)) { activity.setRequestedOrientation(SCREEN_ORIENTATION_PORTRAIT); // Log.d(MainActivity.TAG, "竖屏: "); } } super.handleMessage(msg); } }
OrientationSensorListener.java
public class OrientationSensorListener implements SensorEventListener {
private static final int _DATA_X = 0; private static final int _DATA_Y = 1; private static final int _DATA_Z = 2; public static final int ORIENTATION_UNKNOWN = -1; private Handler rotateHandler; public OrientationSensorListener(Handler handler) { rotateHandler = handler; } public void onAccuracyChanged(Sensor arg0, int arg1) { // TODO Auto-generated method stub } public void onSensorChanged(SensorEvent event) { float[] values = event.values; int orientation = ORIENTATION_UNKNOWN; float X = -values[_DATA_X]; float Y = -values[_DATA_Y]; float Z = -values[_DATA_Z]; float magnitude = X * X + Y * Y; // Don't trust the angle if the magnitude is small compared to the y value if (magnitude * 4 >= Z * Z) { float OneEightyOverPi = 57.29577957855f; float angle = (float) Math.atan2(-Y, X) * OneEightyOverPi; orientation = 90 - (int) Math.round(angle); // normalize to 0 - 359 range while (orientation >= 360) { orientation -= 360; } while (orientation < 0) { orientation += 360; } } if (rotateHandler != null) { rotateHandler.obtainMessage(888, orientation, 0).sendToTarget(); } } }
MainActivity.java
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
private Button button;
private Handler handler;
private OrientationSensorListener listener;
private SensorManager sm;
private Sensor sensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new ChangeOrientationHandler(this);
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
listener = new OrientationSensorListener(handler);
sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_UI);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Log.d(TAG, "onClick: " + getResources().getConfiguration().orientation);
}
});
}
@Override
protected void onPause() {
sm.unregisterListener(listener);
super.onPause();
}
@Override
protected void onResume() {
sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_UI);
super.onResume();
}
}
原文地址:http://blog.youkuaiyun.com/yixiaoqingyuz/article/details/6453798