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

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

参考博文

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

实现目标

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

效果局限

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

代码实现

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

配置资源文件

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

        <string name="screen_rotate_title">Screen rotatestring>        <string name="screen_rotate_summary">Control screen orientationstring>

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

        <string-array name="screen_rotate_entries">        <item>0item>        <item>90item>        <item>180item>        <item>270item>    string-array>        <string-array name="screen_rotate_values" translatable="false">                <item>0item>                <item>90item>                <item>180item>                <item>270item>    string-array>

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

      <string name="screen_rotate_title">屏幕旋转string>        <string name="screen_rotate_summary">控制屏幕方向string>

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

  <string-array name="screen_rotate_entries">    <item>0item>    <item>90item>    <item>180item>    <item>270item>  string-array>

界面搭建

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

    <ListPreference    android: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);}@Overridepublic 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">truebool>

改为

<bool name="def_accelerometer_rotation">falsebool>

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

其他情况

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

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

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

结语

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

更多相关文章

  1. 【Android】图片(文件)上传的请求分析结构
  2. Android获取.Gradle文件中的值和Manifests文件中的值
  3. Android编译系统中头文件搜索路径顺序的一个问题
  4. android解决视图超出屏幕范围显示问题
  5. Android中 将布局文件/View显示至手机屏幕的 整个过程分析
  6. 《转》Android 今日头条屏幕适配方案终极版正式发布!
  7. Android res/raw文件以及raw与res/assets异同
  8. Windows环境下编译Assimp库生成Android可用的.so文件
  9. Android:自适应不同分辨率的屏幕大小、方向和不同分辨率的字体大

随机推荐

  1. [Phoenix系列]Phoenix入门到精通续集
  2. Python编程必备5大工具,你用过几个?
  3. HBase应用实践专场-HBase问题排查思路
  4. 中国HBase技术社区第五届MeetUp
  5. Spark 从 Kafka 读数并发问题
  6. 简单介绍虚拟化技术vs容器化(2)
  7. Apache Flink状态管理和容错机制介绍
  8. Linux由几部分组成?Linux系统结构介绍!
  9. Flink在唯品会的实践
  10. Go语言学习8-接口类型