2025年android系统之窗口横屏锁定以屏幕方向介绍

android系统之窗口横屏锁定以屏幕方向介绍android 源码中通过 PhoneWindowM java 来管理窗口的显示 为 WMS 的一个主要部分 其源码地址如下 frameworks base services core java com android server policy PhoneWindowM java PhoneWindowM

大家好,我是讯享网,很高兴认识大家。

android源码中通过PhoneWindowManager.java来管理窗口的显示,为WMS的一个主要部分。其源码地址如下:

frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

PhoneWindowManager关于屏幕方向控制的主要代码如下:

 int mLandscapeRotation = 0; // default landscape rotation int mSeascapeRotation = 0; // "other" landscape rotation, 180 degrees from mLandscapeRotation int mPortraitRotation = 0; // default portrait rotation int mUpsideDownRotation = 0; // "other" portrait rotation @Override public void setInitialDisplaySize(Display display, int width, int height, int density) { 
    ...代码省略 final Resources res = mContext.getResources(); int shortSize, longSize; if (width > height) { 
    shortSize = height; longSize = width; mLandscapeRotation = Surface.ROTATION_0; mSeascapeRotation = Surface.ROTATION_180; if (res.getBoolean(com.android.internal.R.bool.config_reverseDefaultRotation)) { 
    mPortraitRotation = Surface.ROTATION_90; mUpsideDownRotation = Surface.ROTATION_270; } else { 
    mPortraitRotation = Surface.ROTATION_270; mUpsideDownRotation = Surface.ROTATION_90; } } else { 
    shortSize = width; longSize = height; mPortraitRotation = Surface.ROTATION_0; mUpsideDownRotation = Surface.ROTATION_180; if (res.getBoolean(com.android.internal.R.bool.config_reverseDefaultRotation)) { 
    mLandscapeRotation = Surface.ROTATION_270; mSeascapeRotation = Surface.ROTATION_90; } else { 
    mLandscapeRotation = Surface.ROTATION_90; mSeascapeRotation = Surface.ROTATION_270; } } ...代码省略 

讯享网

landscape就是的横屏(seascape就是其对面),portrait就是竖屏(upsidedown就是竖屏对立面)。
横屏和竖屏决定了应用的横竖屏方向,如应用的AndroidMenifest.xml中android:screenOrientation=“portrait”,那么该apk运行的window view方向就是mPortraitRotation指定的方向。
通过获取宽高,判断宽高大小来决定显示逻辑,获取android设备的屏幕分辨率:


讯享网

讯享网 DisplayMetrics dm = getResources().getDisplayMetrics(); int screenWidth = dm.widthPixels; int screenHeight = dm.heightPixels; 

手机获取的分辨率宽小于高,如1080X1920,而平板等横屏设备宽大于高,如1920X1080。

屏幕方向为以下四个常量分别代表:

private static final int ROTATION_0 = 0;//初始情况。这个时候设备是横屏还是竖屏与硬件设备安装时默认的显示方向有关。 private static final int ROTATION_90 = 1;//设置屏幕方向自动旋转后,右侧翻起侧立时,屏幕会旋转到这个方向。 private static final int ROTATION_270 = 2;//设置屏幕方向自动旋转后,左侧翻起度侧立时,屏幕会旋转到这个方向。 private static final int ROTATION_180 = 3;//设置屏幕方向自动旋转后,屏幕底部侧立时,屏幕会旋转到这个方向 

手机的四个方向如下图,默认为portrait方向为图一,其次顺时针旋转代表不同方向,横屏对应为图四。
图一
图二
图三
图四
平板的四个方向如下图,默认为landscape方向为图一。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
手机和平板一般不限制横竖屏,但在车机系统和TV系统,为默认的横屏方向,应用也默认横屏显示。当如果对Activvity声明了android:screenOrientation="portrait"的竖直方向,则应用的显示方向就变为ROTATION_90了。由于车机系统和TV系统无感应器不支持旋转,用户看到的是应用旋转的画面,这体验极大的差。
因此对于车机系统和TV系统等特殊设备,需要锁定横屏方向。
锁定横屏的代码如下:

讯享网 ...代码省略 final Resources res = mContext.getResources(); int shortSize, longSize; // lock screen rotation shortSize = height; longSize = width; mPortraitRotation = Surface.ROTATION_0; mUpsideDownRotation = Surface.ROTATION_180; mLandscapeRotation = Surface.ROTATION_0; mSeascapeRotation = Surface.ROTATION_180; ...代码省略 

相当width默认大于height,当声明了android:screenOrientation="portrait"时,mPortraitRotationmUpsideDownRotation也为默认的方向,因此不会进行旋转显示。
当横屏时mNavigationBarCanMove变量为true,即可将导航栏移动到侧边。

小讯
上一篇 2025-02-07 10:14
下一篇 2025-03-20 21:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/18037.html