以通知栏中下拉菜单里面的"自动旋转"按钮为例子,说下横竖屏切换的原理;
点击状态栏中的"自动旋转"按钮,会走下面代码:
frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
protected void handleClick() {
//"自动旋转"的点击事件
if (mController == null) return;
final boolean newState = !mState.value;
//设置横竖屏,newState表示是否保存当前旋转方向
mController.setRotationLocked(!newState);
//刷新界面
refreshState(newState);
}
我们主要看的是,横竖屏是如何设置的,mController的实现类是RotationLockControllerImpl:
public void setRotationLocked(boolean locked) {
RotationPolicy.setRotationLock(mContext, locked);
}
进入到了RotationPolicy里面,继续看:
public static void setRotationLock(Context context, final boolean enabled) {
Settings.System.putIntForUser(context.getContentResolver(),
Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, 0,
UserHandle.USER_CURRENT);
//屏幕旋转度数
final int rotation = areAllRotationsAllowed(context) ? CURRENT_ROTATION : NATURAL_ROTATION;
//设置旋转
setRotationLock(enabled, rotation);
}
private static void setRotationLock(final boolean enabled, final int rotation) {
AsyncTask.execute(new Runnable() {
@Override