一、调用流程: 1、\frameworks\base\core\java\android\view\WindowOrientationListener.java onSensorChanged -- > calculateNewRotation calculateNewRotation -- > onOrientationChanged 2、\frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java onOrientationChanged --> setRotation 3、\frameworks\base\services\java\com\android\server\WindowManagerService.java 中 setRotation --> setRotationUncheckedLocked public boolean setRotationUncheckedLocked(int rotation, int animFlags) // 函数用来最终设置屏方向。 二、 calculateNewRotation()函数 private void calculateNewRotation(float orientation, float tiltAngle) {
if (localLOGV) Log.i(TAG, orientation + ", " + tiltAngle + ", " + mRotation);

//final boolean allow180Rotation = mAllow180Rotation;
final boolean allow180Rotation = true;
int thresholdRanges[][] = allow180Rotation ? THRESHOLDS_WITH_180[mRotation] : THRESHOLDS[mRotation]; //判断支持哪种旋转模式 THRESHOLDS_WITH_180 或THRESHOLDS
int row = -1;
for (int i = 0; i < thresholdRanges.length; i++) {
if (orientation >= thresholdRanges[i][0] && orientation < thresholdRanges[i][1]) { //判断旋转地范围
row = i;
break;
}
}
if (row == -1) return; // no matching transition int rotation = allow180Rotation ? ROTATE_TO_WITH_180[mRotation][row] : ROTATE_TO[mRotation][row]; //根据mRotation、row判断旋转方向,也就是要转向的那个方向 //此时mRotation对应你当前屏幕方向, rotation 是你马上要转向的那个方向
if (tiltAngle > MAX_TRANSITION_TILT[rotation]) {
// tilted too far flat to go to this rotation
return;
}
if (localLOGV) Log.i(TAG, "orientation " + orientation + " gives new rotation = " + rotation);
mRotation = rotation; //此时 mRotation 对应你要转向的方向了
mOrientationListener.onOrientationChanged(INTERNAL_TO_SURFACE_ROTATION[mRotation]); // 将mRotation传递到WindowManagerService.java中做屏幕的旋转
} 修改备忘 路径:frameworks\base\core\java\android\view\WindowOrientationListener.java /*default
private static final int[][] ROTATE_TO_WITH_180 = new int[][] {
{ROTATION_90, ROTATION_180, ROTATION_270},
{ROTATION_0, ROTATION_180, ROTATION_90, ROTATION_0},
{ROTATION_0, ROTATION_270, ROTATION_180, ROTATION_0},
{ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_0},
};
*/
private static final int[][] ROTATE_TO_WITH_180 = new int[][] {
{ROTATION_90, ROTATION_180, ROTATION_270},
{ROTATION_0, ROTATION_180, ROTATION_270, ROTATION_0},
{ROTATION_0, ROTATION_90, ROTATION_180, ROTATION_0},
{ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_0},
};

更多相关文章

  1. 在Activity里获取android屏幕方向并处理相关事件
  2. android屏幕常亮保持
  3. Android:注册一个方向传感器的回调,能够让app常驻内存不被杀死
  4. Android 横竖屏幕切换监听
  5. Android 实现调整屏幕亮度,以及自动适应
  6. Android获取状态栏、标题栏、ActionBar以及屏幕的高度
  7. Android屏幕及view的截图实例详解
  8. Android获取屏幕的高度和宽度

随机推荐

  1. (2016.5.26更新8.0.1失效问题)Android(安
  2. android用什么表示本机地址
  3. Testing和Instrumentation
  4. 面试之Android五种布局
  5. android 基础学习(5)-----Android(安卓)B
  6. 接触Android
  7. android selector 选择器失效
  8. 给Android开发者的Flutter指南 (下) [翻
  9. Android(安卓)中 "@+id"的作用是什么?以及
  10. Android(安卓)四大组件 及其理解