在Android的 设置->显示 中增加控制屏幕旋转方向的选项

  • 参考博文
  • 实现目标
    • 效果局限
  • 代码实现
    • 配置资源文件
    • 界面搭建
    • 功能实现
  • 默认值修改
  • 其他情况
  • 结语

参考博文

Android-x86-6.0定制之路 - 屏幕旋转功能

实现目标

在 设置->显示 中添加一个选项,以控制旋转方向,具体效果请参考上方的博文
(本人的 Android 是 5.1 版本)

效果局限

实现屏幕旋转的一个非常的简单的方式,利用 Settings.System.USER_ROTATION 这个系统数据库字段来实现,但是这有个缺陷,就是开机的动画不能随着设置好的屏幕方向旋转,不过这影响也不大

代码实现

注 :本文的代码实现给出了所有需要修改的部分,绝无省略,如若失败,考虑是否是 Android 版本的差别,或是源码限定了屏幕的初始方向,导致不支持旋转。可自行研究,但本文所给出的方法是可行的,可根据自身源码略作修改

配置资源文件

配置旋转选项的名称说明
packages/apps/Settings/res/values/strings.xml 文件

    <!-- Screen rotate title--><string name="screen_rotate_title">Screen rotate</string><!-- Screen rotate summary--><string name="screen_rotate_summary">Control screen orientation</string>

配置选择按钮,“screen_rotate_entries” 对应选项名称,“screen_rotate_values” 对应选项的值;translatable=“false” 表示不支持翻译,即不必再对 “screen_rotate_values” 配置中文格式
packages/apps/Settings/res/values/arrays.xml 文件

    <!-- Screen rotate settings.  These are shown in a list dialog. --><string-array name="screen_rotate_entries"><item>0</item><item>90</item><item>180</item><item>270</item></string-array><!-- Do not translate. --><string-array name="screen_rotate_values" translatable="false"><!-- Do not translate. --><item>0</item><!-- Do not translate. --><item>90</item><!-- Do not translate. --><item>180</item><!-- Do not translate. --><item>270</item></string-array>

对应 “values/arrays.xml” 的中文格式,
packages/apps/Settings/res/values-zh-rCN/strings.xml 文件

  <!-- Screen rotate title--><string name="screen_rotate_title">屏幕旋转</string><!-- Screen rotate summary--><string name="screen_rotate_summary">控制屏幕方向</string>

对应 “values/arrays.xml” 的中文格式(注意,前面说过 “screen_rotate_values” 不必再重复写了),
packages/apps/Settings/res/values-zh-rCN/arrays.xml 文件

<!-- Screen rotate settings.  These are shown in a list dialog. --><string-array name="screen_rotate_entries"><item>0</item><item>90</item><item>180</item><item>270</item></string-array>

界面搭建

完成下面这一步之后,直接编译的话,其实按钮就已经显示出来的,但是要实现功能还要继续
packages/apps/Settings/res/xml/display_settings.xml 文件

    <ListPreferenceandroid:key="screen_rotate"android:title="@string/screen_rotate_title"android:summary="@string/screen_rotate_summary"android:persistent="false"android:entries="@array/screen_rotate_entries"android:entryValues="@array/screen_rotate_values" />

功能实现

本小节都是在 packages/apps/Settings/src/com/android/settings/DisplaySettings.java 中实现的,DisplaySettings.java,顾名思义就是 Settings->Display,就是配置 设置->显示 的文件
首先需要 import android.view.Surface

  1. 定义变量
    加在 DisplaySettings 类里即可,不用放到 onCreate() 里面,应该很好理解
   private static final String KEY_SCREEN_ROTATE = "screen_rotate";private ListPreference mScreenRotatePreference;
  1. 绑定控件
    加在 onCreate() 里面。尽量放靠前一点,我刚开始就是加在 onCreate() 的最后,导致不成功(好像代码运行不到那里,原因不清楚)
mScreenRotatePreference = (ListPreference) findPreference(KEY_SCREEN_ROTATE);
if (mScreenRotatePreference != null) {mScreenRotatePreference.setOnPreferenceChangeListener(this);
}
  1. 控件赋值
    就放在 “绑定控件” 的后面即可
int index = Settings.System.getInt(getContentResolver(), Settings.System.USER_ROTATION, 0);
mScreenRotatePreference.setValueIndex(index);
  1. 选项切换实现
    setScreenRotation 函数放在 DisplaySettings 类中即可,不要放错在其他函数里面。
    onPreferenceChange 是本来就有的函数,只需要对照下面代码,添加进原本没有的部分
public void setScreenRotation(String value) {int rotation = 0;if (value.equals("0")) {rotation = Surface.ROTATION_0;} else if (value.equals("90")) {rotation = Surface.ROTATION_90;} else if (value.equals("180")) {rotation = Surface.ROTATION_180;} else if (value.equals("270")) {rotation = Surface.ROTATION_270;}Settings.System.putInt(getContentResolver(), Settings.System.USER_ROTATION, rotation);
}@Override
public boolean onPreferenceChange(Preference preference, Object objValue) {final String key = preference.getKey();if (key.equals(KEY_SCREEN_ROTATE)) {setScreenRotation((String) objValue);}
}

默认值修改

关闭重力感应
修改 Settings.System.USER_ROTATION 数据库字段实现屏幕旋转,必须关闭重力感应我一开始就是没关闭,导致了旋转不了),对应 Settings.System.ACCELEROMETER_ROTATION 数据库字段,这里直接去修改数据库的默认值
base/packages/SettingsProvider/res/values/defaults.xml 文件

<bool name="def_accelerometer_rotation">true</bool>

改为

<bool name="def_accelerometer_rotation">false</bool>

参考博文中还设置了默认竖屏,这个不是必须的,不会影响到最终的旋转

其他情况

如果按照上面的步骤都不能旋转,看看这个文件
frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java
updateOrientationFromAppTokensLocked() 函数,
如果有

   req = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
或 req = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

的部分,可以考虑把它注释掉,因为那两个分别是限定了横屏和竖屏的,这会限制旋转,导致不成功

结语

完整过程就这样,可以对照着参考博文来进行,如果遇到问题,可以评论留言,看到我会回复的

在Android的 设置-显示 中增加控制屏幕旋转方向的选项相关推荐

  1. android yuv加水印_在Android采集视频过程中增加水印功能实现

    CSDN旧文搬迁! 在Android采集视频过程中增加水印,并且水印包含一个变化的时间戳,这里考虑方案实现的时候,就想到了ffmpeg,ffmpeg包含很多filter能实现水印添加的功能. 基本实现 ...

  2. linux 支持的字体命令,Linux设置显示中文和字体

    Linux设置显示中文和设置字体 设置中文 一.查看当前使用的系统语言 登陆linux系统打开操作终端之后,输入 echo $LANG可以查看当前使用的系统语言.如 echo $LANG image. ...

  3. Android 9.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

    1.前言 在android9.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度,旋转2 ...

  4. Android 12.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

    1.前言 在android12.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, ...

  5. windows7下系统保护中出现错误“文件名、目录名或卷标语法不正确。(0x8007007B)“ 以及保护设置列表中出现“Windows7_os(c:)(找不到)”选项时的解决方法...

    windows7下系统保护功能很是鸡肋,有事会出现一下两个问题: 1.出现错误"文件名.目录名或卷标语法不正确.(0x8007007B) 2.保护设置列表中出现"Windows7_ ...

  6. 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像格式与 Camera图像传感器方向问题 二. NV21 图像格式视频旋转 1. 图像旋转问题及解决方案 ( 顺时针旋转 90 度 ) 2. NV ...

  7. android 強制屏幕方向,今日精品安卓App推荐:锁定屏幕旋转方向

    [PConline 资讯]不知道各位用安卓的朋友有没有遇到过这样一种情况,玩某个游戏横屏时屏幕向右转,另一个游戏就向左转了,用某些播放器如新闻客户端之类的看视频,甚至还不能横屏.安卓上横屏方向不统一的 ...

  8. iOS6的控制屏幕旋转技巧

    在iOS5.1 和 之前的版本中, 我们通常利用 shouldAutorotateToInterfaceOrientation: 来单独控制某个UIViewController的旋屏方向支持,比如: ...

  9. iOS_控制屏幕旋转

    1 首先在Xcode工程配置中设置 项目支持哪些方向上的旋转 从上往下分别是  上.下.左右  如图所示 表示当前项目 支持竖屏.左右横屏.Xcode中的配置是全局的,意味着项目中所有的控制器都默认支 ...

最新文章

  1. 【错误记录】BLE 蓝牙搜索失效 ( 关闭了 GPS 定位导致的问题 | 蓝牙串口工具推荐 )
  2. ApiOperationSupport注解的使用
  3. Java后台调用Flex自定义类型 (Java和AS类型转换问题)
  4. Linux: 传参数给alias
  5. 计算机硬件知识考证题,2017年计算机硬件知识考试题及答案
  6. python读取行、分割、存储_Pytables / Pandas:组合(读取?)按行分割的多个HDF5存储...
  7. flowable工作流 流程变量_信也科技工作流平台的技术实践
  8. 浅谈面试中常考的两种经典布局——圣杯与双飞翼 1
  9. 单片机怎么学,先从哪入手开始学,怎么开始入门
  10. 读书笔记--正面管教
  11. ubuntu安装github 3D渲染库dirt
  12. 2018湖南省第14届大学生计算机程序设计竞赛---卖萌表情
  13. VMware tool 和window共享文件夹,被坑了许久!!!
  14. 计算机网络技术(一)——概论
  15. python 统计组合用什么库_盘点2018年热门Python库|TOP20
  16. 中国商人黄怒波冰岛租地敲定 600万美元租99年-黄怒波-冰岛-租地
  17. 缩减C盘空间之移动桌面位置
  18. 坚持每日分享5款实用的软件
  19. DEV Accordion Control 控件
  20. oracle golden date-Virtualbox环境

热门文章

  1. 凯撒密码/自定义移位加密
  2. NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低
  3. nRF52832 GATT 自定义Service/Characteristic
  4. 苹果手机投影_手机、平板屏幕投到投影机上常见问题与答案
  5. uniapp预览pdf安卓打不开,可以直接新建commonwebview来跳转外部链接浏览pdf
  6. php guzzlehttp,PHP HTTP客户端-Guzzle原理解析
  7. oracle00312,ORA-00322 ORA-00312 恢复
  8. 随机编码生成器MD5加密字符串工具
  9. 关乎Java多线程+Runnable和Thread…
  10. [必看]身份证复印件的正确用法