android系统旋转方向定制问题

本文介绍如何在Android系统中配置屏幕方向,包括通过属性、数据库设置以及调整横竖屏参数的方法。适用于Android 5.1环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.前言

android开始是给手机使用的,后来拓展到平板、电视等,那么对于系统旋转及默认方向都要根据需求进行修改了(比如电视默认就是横屏),还有比如我在开发一个定制平板时,由于工艺设计的模具与液晶屏的显示0点方向就偏转了180,这样话关于系统的lanscape,portrait方向都得调整,确实费了不少工费,而关于这些方便的修改可能要改好几个地方,下面我会尽量理出来,环境为android 5.1。


1. 属性

persist.panel.orientation

取值:0,90,180,270

意义:进入android系统时方向(uboot和kernel不受影响,kernel之后滚动画面开始起作用)相对于液晶显示0点逆时针旋转的角度。

影响:多个地方,开机动画,旋转策略,window,surfaceflinger等

frameworks/base/cmds/bootanimation/BootAnimation.cpp

frameworks/base/core/java/com/android/internal/view/RotationPolicy.java

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

frameworks/native/services/surfaceflinger/DisplayDevice.cpp

例子:如下图所示,


如果想让进入android系统滚动画面的时候,显示如上图的平板默认方向(相对LCD物理显示0点李时珍旋转270°的位置,一般来说物理显示0点在上图的左上角,只是结构跟电子弄错了,错就错着来吧),那么要设置persist.panel.orientation=270,一般在$(PRODUCT).mk中加入

ADDITIONAL_BUILD_PROPERTIES += persist.panel.orientation=270,也可以在其他如init.rc或者qcom.prop加入。

2. 数据库

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

<integer name="def_user_rotation">3</integer>

取值:0,1,2,3(分别对应0°,90°,180°,270°)

影响:

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

    loadBooleanSetting(stmt, Settings.System.USER_ROTATION,R.integer.def_user_rotation);

这个数据库在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java中的updateSettings中使用

                // Configure rotation lock.
            int userRotation = Settings.System.getIntForUser(resolver,
                    Settings.System.USER_ROTATION, Surface.ROTATION_270,
                    UserHandle.USER_CURRENT);
            if (mUserRotation != userRotation) {
                mUserRotation = userRotation;
                updateRotation = true;
            }

这段代码会在进入锁屏界面的时候,在更新一次:如果数据库Settings.System.USER_ROTATION值与persist.panel.orientation不一致,就更新界面方向。设置数据库DatabaseHelper.java的时候要放好位置,最好在公共的地方修改,不要再upgradeVersion判断的地方修改,我就犯错了在不知道版本的情况下修改,导致这个数据库没生效。

3. LANDSCAPE/PORTRAIT 

取值:Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_180, Surface.ROTATION_270

影响:frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

landscape就是的横屏(seascape就是其对面),portrait就是竖屏(upsidedown就是竖屏对立面)

这4个方向也要对应调整,横屏和竖屏决定了应用的横竖屏方向,如应用的AndroidMenifest.xml中android:screenOrientation="portrait",那么该apk运行的window view方向就是mPortraitRotation指定的方向,视频播放软件默认的竖屏也是这个,当播放器点击全屏(就是横屏)就是由mLandscapeRotation决定。按照上面我画的需求,修改如下:

    mPortraitRotation = Surface.ROTATION_180;
    mUpsideDownRotation = Surface.ROTATION_0;                       
    mLandscapeRotation = Surface.ROTATION_270;
    mSeascapeRotation = Surface.ROTATION_90;


### Android 中实现 Drawable 图标旋转的方法 在 Android 开发中,可以通过多种方式实现 Drawable 图标的旋转操作。以下是几种常见的方法以及其实现细节。 --- #### **1. 使用 XML 定义旋转动画** 可以直接通过 XML 文件定义一个旋转动画并应用到 Drawable 上。这种方式简单直观,适合静态资源的处理。 ```xml <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_arrow" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="180" /> ``` 上述代码片段展示了如何创建一个简单的旋转动画[^1]。其中的关键属性解释如下: - `android:fromDegrees` 表示起始角度。 - `android:toDegrees` 表示终止角度。 - `android:pivotX` 和 `android:pivotY` 定义了旋转中心点的位置比例(范围为 0% 到 100%,分别对应左边缘和右边缘)。 将该文件保存为 `res/drawable/rotation.xml` 后即可作为普通的 Drawable 应用到视图中。 --- #### **2. 动态设置旋转动画** 除了预定义 XML 文件外,还可以利用 Java/Kotlin 编程语言动态生成旋转效果: ```java RotateAnimation rotateAnimation = new RotateAnimation( 0, // fromDegrees 起始角度 180, // toDegrees 终止角度 Animation.RELATIVE_TO_SELF, 0.5f, // pivotXType 和 pivotXValue 定义水平轴心位置 Animation.RELATIVE_TO_SELF, 0.5f); // pivotYType 和 pivotYValue 定义垂直轴心位置 rotateAnimation.setDuration(1000); // 设置动画持续时间(毫秒) rotateAnimation.setFillAfter(true); // 动画结束后保持最终状态 ImageView imageView = findViewById(R.id.imageView); imageView.startAnimation(rotateAnimation); ``` 此代码段演示了如何基于 `RotateAnimation` 类构建动态旋转效果,并将其绑定至 ImageView 控件上显示目标 Drawable 图标[^1]。 --- #### **3. 自定义 Drawable 添加旋转逻辑** 对于更复杂的需求,可以继承 `Drawable` 创建自定义类,在绘制过程中加入旋转变换矩阵的支持: ```java public class RotatedDrawable extends DrawableWrapper { private float rotationDegree; public RotatedDrawable(Drawable drawable) { super(drawable); } @Override public void draw(Canvas canvas) { int saveCount = canvas.save(); Rect bounds = getBounds(); float centerX = bounds.exactCenterX(); float centerY = bounds.exactCenterY(); canvas.rotate(rotationDegree, centerX, centerY); super.draw(canvas); canvas.restoreToCount(saveCount); } public void setRotation(float degree) { this.rotationDegree = degree; invalidateSelf(); // 请求重绘以反映更改 } } ``` 使用时只需实例化此类并将原始 Drawable 封装进去即可完成定制化的旋转功能[^3]。 --- #### **4. 借助 LevelListDrawable 实现渐变式旋转** 如果希望随着某个数变化而逐步调整图标的方向,则推荐采用 `LevelListDrawable` 配合多个不同朝向的小幅位移帧序列来模拟连续运动轨迹的效果[^2]: ```xml <?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 每一帧代表一定幅度内的转向 --> <item android:maxLevel="9" android:drawable="@drawable/frame_1"/> <item android:maxLevel="18" android:drawable="@drawable/frame_2"/> </level-list> ``` 随后可通过调用 `setLevel()` 方法改变当前展示的具体帧索引来达到目的。 --- ### 总结 以上介绍了四种主要途径帮助开发者灵活应对各种实际项目里关于 Drawable 图标旋转的应用场景需求。每种方案各有优劣之处,具体选用哪一种取决于业务背景和个人偏好等因素考量。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值