查看,设置,设备的 竖屏-横屏模式 screen.orientation

本文介绍了一种利用JavaScript监听屏幕旋转并实现图片全屏展示的方法。通过screen.orientation API可以获取和设置屏幕方向,结合HTML5的全屏API,可以在不同方向下提供更好的用户体验。

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

<body>
  <div id="doc"></div>
  <div id="model"></div>
  <script>
    let a = 0;
  if ('orientation' in screen) {
    document.getElementById('doc').textContent = `屏幕旋转了${a}次.`;
    document.getElementById('model').textContent = `当前为${screen.orientation.type}模式!`;

    screen.orientation.addEventListener('change', function () {// 监听屏幕的旋转
      a++;
      document.getElementById('doc').textContent = `屏幕旋转了${a}次.`;
      if (screen.orientation.type.startsWith('landscape')) {
        document.getElementById('model').textContent = `当前为横屏模式!`;
      } else {
        document.getElementById('model').textContent = `当前为纵向模式!`;
      }
    });
  }
  </script>
</body>

screen.orientation.lock 开发者主动切换 landscape 和 portrait 模式

对应的 screen.orientation.unlock();


<!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]-->
<!--[if IE 7]><html class="no-js lt-ie9 lt-ie8"><![endif]-->
<!--[if IE 8]><html class="no-js lt-ie9"><![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->
<html lang="zh-cmn-Hans">

<head>
  <meta charset="utf-8">
  <title>video 全屏体验</title>
  <link rel="shortcut icon" type="image/ico" href="" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <!--移动端视图-->
  <meta name="renderer" content="webkit" />
  <meta name="keywords" content="ajanuw" />
  <!--关键词-->
  <meta name="description" content="ajanuw, b,c" />
  <!--网站内容描述-->
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <meta http-equiv="Pragma" content="no-cache" />
  <!--禁止浏览器从本地计算机的缓存中访问页面内容-->
  <meta http-equiv="Window-target" content="_top" />
  <!--强制页面在当前窗口以独立页面显示-->
  <meta http-equiv="content-Type" content="text/html;charset=utf-8" />
  <!--显示字符集的设定-->
  <meta http-equiv="Content-Language" content="zh-cn" />
  <!--显示语言的设定-->
  <meta http-equiv="imagetoolbar" content="false" />
  <!--指定是否显示图片工具栏,false不显示,true显示-->
  <link rel="icon" sizes="192x192" href="https://pic.cnblogs.com/avatar/1053296/20171128213246.png" />
  <link rel="apple-touch-icon" href="https://pic.cnblogs.com/avatar/1053296/20171128213246.png" />
  <meta name="msapplication-square310x310logo" content="https://pic.cnblogs.com/avatar/1053296/20171128213246.png" />
  <meta name="theme-color" content="#ff4081" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
  <!-- Chrome, Firefox OS and Opera -->
  <link rel="apple-touch-startup-image" href="https://pic.cnblogs.com/avatar/1053296/20171128213246.png" />
  <style>
    .full-img {
      max-width: 100%;
    }
  </style>
</head>

<body>
  <!--[if lt IE 8]>  <h3>请升级你的浏览器,或更换主浏览器!!!</h3>  <![endif]-->
  <img class="full-img" src="http://per.kelantu.com/photos/1515232896-FnIf9c57Hf1-l7DUdBwlXdN1bcLv-orij0?e=3153600000&token=CT86R8zZYVXDyHWEWFoMX4pz0ksOzxtKCaC80si4:HcaTgLGmJ6IbOt_d9ZGOQIqtv6g="
    alt="">
  <div class="doc"></div>
  <script>
    let img = document.querySelector('.full-img');
    img.addEventListener('click', function (e) {
      if (document.requestFullscreen) {
        // 存在全屏 元素就退出全屏
        document.exitFullscreen();
      } else {
        requestFullscreenImage();
        lockScreenInLandscape();
      }
    }, false);

    function requestFullscreenImage() {
      if (img.requestFullscreen) {
        img.requestFullscreen();
      } else {
        img.webkitRequestFullscreen();
      }
    }

    function lockScreenInLandscape() {
      if (!('orientation' in screen)) {
        return;
      }

      // 判断当前 设备是 竖屏还是 横屏
      // portrait 竖屏
      // landscape 横屏
      if (matchMedia('(orientation: portrait) and (max-device-width: 768px)').matches) {
        // 竖屏就变 横屏
        screen.orientation.lock('landscape').then(function () {
          setTimeout(()=>{
            screen.orientation.unlock();
            // document.exitFullscreen();
            document.webkitExitFullscreen()
          }, 2000);
        });
      }
    }
  </script>
</body>

</html>

转载于:https://www.cnblogs.com/ajanuw/p/8409350.html

<think>我们正在解决两个核心问题:1.`windowManager.defaultDisplay.orientation`值为3时代表的幕方向2.横屏模式下从APPA跳转到APPB的Activity时,Activity未充满幕的问题(特别是在平板上)首先解决第一个问题:根据Android官方文档,`Display.getRotation()`返回的整数值代表幕的旋转状态,该值与`Surface.ROTATION_*`常量对应:-`Surface.ROTATION_0`(0):正常方向(未旋转)-`Surface.ROTATION_90`(1):旋转90度(横屏设备顶部在左侧)-`Surface.ROTATION_180`(2):旋转180度(倒置)-`Surface.ROTATION_270`(3):旋转270度(横屏设备顶部在右侧)因此,值为3代表旋转270度,也就是横屏模式,但是设备顶部在右侧(与90度旋转方向相反)。注意:`orientation`值通常与设备当前物理方向相关,而横屏模式有两种:一种是正常横屏(90度旋转),一种是反向横屏(270度旋转)。现在解决第二个问题:横屏模式下Activity未充满幕。参考之前的解决方案以及站内引用,我们可以采取以下措施:1.**确保目标Activity的横屏配置**:在ModuleB的AndroidManifest.xml中设置Activity的方向为横屏(或锁定为横屏),并处理配置变化:```xml<activityandroid:name=".TargetActivity"android:screenOrientation="landscape"android:configChanges="orientation|screenSize".../>```注意:这里使用`landscape`会同时支持正常横屏和反向横屏,因为系统会自动处理。2.**传递幕尺寸并设置窗口大小**(参考之前的解决方案):在跳转时,从APPA中获取当前幕的尺寸,传递给ModuleB的Activity,然后在ModuleB的Activity中设置窗口尺寸。3.**使用全模式**(参考引用[1]):如果需要全(隐藏状态栏),可以在ModuleB的Activity中调用:```javagetWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);```4.**处理横切换时的布局变化**(参考引用[3]):对于输入法或幕旋转等导致的窗口大小变化,要确保布局能够自适应调整。5.**检查横屏布局资源**:在ModuleB中提供横屏专属布局(layout-land目录)或确保默认布局能自适应横屏。6.**检查设备配置**(参考引用[2]和[4]):在代码中获取当前方向,确保当前确实是横屏状态,并据此调整布局:```javabooleanisLandscape=getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE;```但是,根据引用[4]中提到的,在AndroidManifest.xml中设置`screenOrientation`不起作用的问题,我们可以采用更可靠的方法:-在Activity中设置方向:```javasetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);```另外,在平板设备上,可能由于分模式等导致Activity窗口大小受限,因此我们需要确保Activity是作为全独立任务启动。综合以上,给出以下解决方案步骤:###解决方案####步骤1:确认并设置目标Activity的方向在ModuleB的`AndroidManifest.xml`中声明横屏,如果不起作用,在Activity的`onCreate`中动态设置:```javasetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);```####步骤2:传递幕尺寸并设置窗口大小在APPA跳转时:```javaIntentintent=newIntent(this,com.moduleB.TargetActivity.class);//获取幕的宽高(注意:横屏模式下宽高值已经交换)DisplayMetricsdisplayMetrics=newDisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);intent.putExtra("width",displayMetrics.widthPixels);intent.putExtra("height",displayMetrics.heightPixels);startActivity(intent);```在ModuleB的Activity中:```java@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//获取传递过来的宽高intwidth=getIntent().getIntExtra("width",0);intheight=getIntent().getIntExtra("height",0);if(width>0&&height>0){WindowManager.LayoutParamsparams=getWindow().getAttributes();//设置窗口宽高(这里设置为全)params.width=width;params.height=height;getWindow().setAttributes(params);}//或者另一种方式:全getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.activity_target);}```####步骤3:在ModuleB中提供横屏布局在资源目录`res/layout-land`下创建横屏布局`activity_target.xml`,确保使用`match_parent`来充满整个幕。####步骤4:处理配置变化如果Activity在横屏模式下可能会因为其他配置变化(如键盘弹出)而调整窗口,我们需要在清单文件中声明处理配置变化,以避免Activity重建:```xmlandroid:configChanges="orientation|screenSize|keyboardHidden"```并且在Activity中覆写`onConfigurationChanged`方法,根据新的方向重新布局:```java@OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig){super.onConfigurationChanged(newConfig);if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){//重新设置布局,确保充满幕setContentView(R.layout.activity_target);}}```###相关问题§§相关问题§§1.如何检测幕旋转方向(0,1,2,3)分别代表什么?2.在Android开发中如何强制设置Activity为横屏?3.横屏模式下Activity未充满幕可能的原因有哪些?4.如何确保跨模块跳转时,Activity的横屏布局正确加载?</think> ### `WindowManager.defaultDisplay.orientation = 3` 的解释与解决方案 #### 1️⃣ **`orientation = 3` 的含义** 在 Android 中,`WindowManager.defaultDisplay.orientation` 返回幕的物理旋转方向,对应以下常量(定义在 `Surface` 类中): - `Surface.ROTATION_0` = `0`:设备正常 - `Surface.ROTATION_90` = `1`:设备左转横屏(顶部在左侧) - **`Surface.ROTATION_180` = `2`:设备倒置(上下颠倒)** - **`Surface.ROTATION_270` = `3`:设备右转横屏(顶部在右侧)** 因此,**`orientation = 3` 表示设备处于右转横屏模式**,即平板右侧向下时的横屏状态(见图示): ``` 📱 平板物理方向 → 📴 [Home键在右下角] ``` 这属于横屏的特殊场景,系统可能未正确处理反向横屏的布局[^2][^4]。 --- #### 2️⃣ **横屏未充满幕的原因分析** 结合问题描述和引用资料,核心原因如下: 1. **反向横屏适配缺失** - 设备右转横屏(`orientation=3`)时,系统可能错误应用布局或非全配置[^4] - 部分设备(如折叠)需特殊处理布局参数[^2] 2. **窗口尺寸传递失败** - 跳转时未携带主APP的幕尺寸参数 - Module B 的 Activity 默认使用系统默认窗口尺寸(非全) 3. **系统级配置冲突** - `config.xml` 中如 `hotseat_transpose_layout_with_orientation=false` 等参数影响布局方向[^2] - `isLandscape=true` 但 `transposeLayoutWithOrientation=false` 导致反向横屏异常 --- #### 3️⃣ **完整解决方案(修复反向横屏和全问题)** ##### ✅ 步骤1:修复反向横屏适配 ```java // Module B的Activity中(onCreate方法内) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // 强制锁定为系统所有横屏方向(包括反向) setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); } else { // 兼容旧版本 if (getWindowManager().getDefaultDisplay().getRotation() == Surface.ROTATION_270) { // 特殊处理右转横屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); } } ``` ##### ✅ 步骤2:动态设置窗口尺寸 ```java // 在APP A跳转时传递精确幕尺寸 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getRealMetrics(metrics); // 含状态栏区域 Intent intent = new Intent(); intent.putExtra("screen_width", metrics.widthPixels); intent.putExtra("screen_height", metrics.heightPixels); startActivity(intent); ``` ```java // Module B的Activity中(onCreate方法内) Bundle extras = getIntent().getExtras(); if (extras != null) { int width = extras.getInt("screen_width", 0); int height = extras.getInt("screen_height", 0); if (width > 0 && height > 0) { // 关键:设置精确窗口尺寸 getWindow().setLayout(width, height); // 移除默认背景(避免边距)[^1] getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } } // 兼容横切换[^3] @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); } } ``` ##### ✅ 步骤3:修改系统级参数(需Root设备) 若设备为平板/折叠,在 `config.xml` 增加配置[^2]: ```xml <!-- 路径: /res/values/config.xml --> <bool name="hotseat_transpose_layout_with_orientation">true</bool> <bool name="allow_rotation">true</bool> ``` --- #### 4️⃣ **测试验证命令** ```bash # 模拟反向横屏启动Activity adb shell am start -a android.intent.action.MAIN \ --ei screen_width 1600 \ --ei screen_height 2560 \ --activity-screenshot \ --activity-rotation 270 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值