OpenHarmony开发者论坛

标题: 如何监听当前屏幕的横竖屏状态?如何实现页面跟随屏幕横竖屏自动旋转? [打印本页]

作者: 北向实践与赋能    时间: 2024-1-4 11:33
标题: 如何监听当前屏幕的横竖屏状态?如何实现页面跟随屏幕横竖屏自动旋转?
[md]如何监听当前屏幕的横竖屏状态?如何实现页面跟随屏幕横竖屏自动旋转?
[/md]
作者: 北向实践与赋能    时间: 2024-1-4 11:34
标题: 如何监听当前屏幕的横竖屏状态?如何实现页面跟随屏幕横竖屏自动旋转?
[md]**关键字**
屏幕旋转,自动旋转

**解决方案**
如何监听当前屏幕的横竖屏状态?
应用可以通过diplay.on监听屏幕状态改变
 
如何实现页面跟随屏幕横竖屏自动旋转?
1、Abilty级别配置:在模块配置文件module.json5中将EntryAbility设置为"orientation";
2、动态设置:使用window.setPreferredOrientation设置窗口方向

示例代码

```ts
import window from '@ohos.window';
import display from '@ohos.display';

const TAG = 'foo'
const ORIENTATION: Array<string> = ['垂直', '水平', '反向垂直', '反向水平']

@Entry
@Component
struct ScreenTest {
  @State rotation: number = 0
  @State message: string = ORIENTATION[this.rotation]

  aboutToAppear() {
    this.setOrientation()

    let callback = async () => {
      let d = await display.getDefaultDisplaySync()
      this.rotation = d.rotation
      this.message = ORIENTATION[this.rotation]
      console.info(TAG, JSON.stringify(d))
    }
    try {
      display.on("change", callback); //监听屏幕状态改变
    } catch (exception) {
      console.error(TAG, 'Failed to register callback. Code: ' + JSON.stringify(exception));
    }
  }

  setOrientation() {
    try {
      window.getLastWindow(getContext(this), (err, data) => { //获取window实例
        if (err.code) {
          console.error(TAG, 'Failed to obtain the top window. Cause: ' + JSON.stringify(err));
          return;
        }
        let windowClass = data;
        console.info(TAG, 'Succeeded in obtaining the top window. Data: ' + JSON.stringify(data));

        let orientation = window.Orientation.AUTO_ROTATION; //设置窗口方向为传感器自动旋转模式。
        try {
          windowClass.setPreferredOrientation(orientation, (err) => {
            if (err.code) {
              console.error(TAG, 'Failed to set window orientation. Cause: ' + JSON.stringify(err));
              return;
            }
            console.info(TAG, 'Succeeded in setting window orientation.');
          });
        } catch (exception) {
          console.error(TAG, 'Failed to set window orientation. Cause: ' + JSON.stringify(exception));
        }
        ;
      });
    } catch (exception) {
      console.error(TAG, 'Failed to obtain the top window. Cause: ' + JSON.stringify(exception));
    }
    ;
  }

  build() {
    Row() {
      Column() {
        Text(`${this.rotation}`).fontSize(25)
        Text(`${this.message}`).fontSize(25)
      }
      .width("100%")
    }
    .height("100%")
  }
}
```

**参考资料**

https://gitee.com/openharmony/do ... eferredorientation9

https://gitee.com/openharmony/do ... ayonaddremovechange
[/md]
作者: iamdaidai    时间: 2024-7-30 11:22
回复 北向实践与赋能: 请问下,您这个转了之后,按钮什么的能正常操作吗?我的转了,按钮等控件无法正常操作了
作者: qq_44160056    时间: 6 天前
回复 iamdaidai: 我也是这个问题,求解答

作者: 我爱代码!代码爱我    时间: 5 天前
回复 iamdaidai: 您现在解决了吗?现在发现个问题是,不在全屏的模式下是没问题的,但只要设置成全屏,就会出现类似问题.所以,求解答





欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5