当前位置: 首页 > news >正文

【Android 11】AOSP Settings添加屏幕旋转按钮

前言

这里是客户要求添加按钮以实现屏幕旋转。屏幕旋转使用adb的命令很容易实现:

#屏幕翻转
adb shell settings put system user_rotation 1
#屏幕正常模式
adb shell settings put system user_rotation 0

这里的值可以是0,1,2,3 的任意一个。我这里没有陀螺仪,所以只需要这个命令就够了。更多的可以参考android 通过adb shell命令旋转Android屏幕朝向方向
但是这有个缺陷,就是开机的动画不能随着设置好的屏幕方向旋转

图片效果

在这里插入图片描述
在这里插入图片描述

代码

  1. 首先在资源配置文件中定义我们需要用到的字段,以供后面国际化适配的时候更方便
    b/packages/apps/Settings/res/values/strings.xml
@@ -2706,6 +2706,10 @@
+    <!-- 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_title screen_rotate_summary

  1. 然后配置我们的四个选项值
    packages/apps/Settings/res/values/arrays.xml
@@ -1501,4 +1501,24 @@<item>@string/rtt_settings_always_visible</item></string-array>+    <!-- 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>
+
  1. 在xml中增加我们需要的List按钮,我这里放在了settings——display界面。
    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"
+    settings:controller="com.android.settings.display.ScreenRotatePreferenceController"/>
+
  1. 写Controller文件,就是我们上一步设置的com.android.settings.display.ScreenRotatePreferenceController
package com.android.settings.display;import android.content.Context;
import android.provider.Settings;
import android.view.Surface;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import android.util.Log;
import android.content.Intent;public class ScreenRotatePreferenceController extends BasePreferenceController implementsPreference.OnPreferenceChangeListener, PreferenceControllerMixin {public static final String KEY_SCREEN_ROTATE = "screen_rotate";private ListPreference mScreenRotatePreference;public ScreenRotatePreferenceController(Context context, String preferenceKey) {super(context, preferenceKey);}@Overridepublic int getAvailabilityStatus() {return AVAILABLE;}@Overridepublic void displayPreference(PreferenceScreen screen) {super.displayPreference(screen);mScreenRotatePreference = (ListPreference) screen.findPreference(KEY_SCREEN_ROTATE);if (mScreenRotatePreference != null) {mScreenRotatePreference.setOnPreferenceChangeListener(this);int index = Settings.System.getInt(mContext.getContentResolver(), Settings.System.USER_ROTATION, 0);mScreenRotatePreference.setValueIndex(index);}}public void setScreenRotation(String value) {int rotation = 0;switch (value) {case "0":rotation = Surface.ROTATION_0;break;case "90":rotation = Surface.ROTATION_90;break;case "180":rotation = Surface.ROTATION_180;break;case "270":rotation = Surface.ROTATION_270;break;}Settings.System.putInt(mContext.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);return true;}return false;}
}
  1. 把上面这个加到DisplaySettings.java里面
    packages/apps/Settings/src/com/android/settings/DisplaySettings.java
@@ -32,6 +32,7 @@ import com.android.settings.display.TapToWakePreferenceController;import com.android.settings.display.ThemePreferenceController;import com.android.settings.display.TimeoutPreferenceController;import com.android.settings.display.VrDisplayPreferenceController;
+import com.android.settings.display.ScreenRotatePreferenceController;import com.android.settings.search.BaseSearchIndexProvider;import com.android.settingslib.core.AbstractPreferenceController;import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -90,6 +91,7 @@ public class DisplaySettings extends DashboardFragment {controllers.add(new ShowOperatorNamePreferenceController(context));controllers.add(new ThemePreferenceController(context));controllers.add(new BrightnessLevelPreferenceController(context, lifecycle));
+        controllers.add(new ScreenRotatePreferenceController(context, ScreenRotatePreferenceController.KEY_SCREEN_ROTATE));return controllers;}

相关文章:

  • 每天一个数据分析题(三百八十三)- 聚类
  • 怎么看电脑实时充电功率
  • 关于Notebook环境的安装记录
  • Ubuntu20.04中复现FoundationPose
  • 永磁同步电机驱动死区补偿
  • TIM: A Time Interval Machine for Audio-Visual Action Recognition
  • Gflags的使用
  • rknn转换后精度差异很大,失真算子自纠
  • 未授权访问漏洞总结
  • 一文让你彻底搞懂什么是VR、AR、AV、MR
  • 【ARMv8/ARMv9 硬件加速系列 2.1 -- ARM NEON 向量寄存器单个元素赋值】
  • 噪声-降噪引脚如何提高系统性能
  • [信号与系统]关于双线性变换
  • Vulhub——Log4j、solr
  • Java用文件流mask文本文件某些特定字段
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Android优雅地处理按钮重复点击
  • Angular Elements 及其运作原理
  • CAP理论的例子讲解
  • Java 网络编程(2):UDP 的使用
  • Java读取Properties文件的六种方法
  • JS 面试题总结
  • JS数组方法汇总
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Python 基础起步 (十) 什么叫函数?
  • supervisor 永不挂掉的进程 安装以及使用
  • TCP拥塞控制
  • Vue2 SSR 的优化之旅
  • 对象管理器(defineProperty)学习笔记
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 延迟脚本的方式
  • 阿里云API、SDK和CLI应用实践方案
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #define、const、typedef的差别
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二)Linux——Linux常用指令
  • (七)理解angular中的module和injector,即依赖注入
  • (十六)Flask之蓝图
  • (万字长文)Spring的核心知识尽揽其中
  • (五)IO流之ByteArrayInput/OutputStream
  • (一) storm的集群安装与配置
  • (译)2019年前端性能优化清单 — 下篇
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)nsfocus-绿盟科技笔试题目
  • (转)scrum常见工具列表
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)原始图像数据和PDF中的图像数据
  • .mysql secret在哪_MySQL如何使用索引
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net面试题4
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件