HarmonyOS 是否有只基于Page实现的页面旋转实现

HarmonyOS
2024-12-20 16:30:11
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
shlp

页面级别无法设置只能设置窗口级别的,在页面的生命周期中添加旋转属性:

onPageShow(): void {
  window.getLastWindow(getContext(this), (err, win) => {
  win.setPreferredOrientation(window.Orientation.LANDSCAPE_INVERTED)
})
}

onPageHide(): void {
  window.getLastWindow(getContext(this), (err, win) => {
  win.setPreferredOrientation(window.Orientation.PORTRAIT)
})
}

在一个应用内,不同的页面有不同的旋转策略,可以试试用映射的方式:第一步:在应用统一的位置注册无感监听;

第二步:建立页面与旋转方向的映射表;

第三步:结合全局埋点的能力,实现不同页面的旋转适配

说明:该映射表开发者可以根据实际的诉求使用从本地配置文件更新或者直接使用全局状态变量实现动态修改。

let pageOrientations: Record<string, window.Orientation> = {
  "Logon": window.Orientation.PORTRAIT,
  "Detail": window.Orientation.LANDSCAPE,
  "Page2": window.Orientation.PORTRAIT_INVERTED,
  "Page3": window.Orientation.LANDSCAPE_INVERTED,
}

第三步:根据映射表在无感监听的回调里控制旋转策略;

//判断是否为空 mainWindow
if (!windowName || windowName == 'mainWindow') {
  windowName = 'mainWindow'
}
let name = windowName as string
windows[name] = curWindow;

let myObserve = curWindow.getUIContext().getUIObserver();
mypagestack[name] = new Stack<pageTracking>();

// mypagestack.push <windowName, Stack<pageTracking>>
//监听navDestination组件生命周期变化
myObserve.on('navDestinationUpdate', (info) => {
  //映射成mypage
  let mypage = new MyPage
  mypage.id = info.navDestinationId
  mypage.name = info.name
  mypage.path = info.param?.toString()
  mypage.type = 'NavDestination'
  mypage.lifeCricle = info.state
  //
  tracking(mypage, name)

})
//监听page生命周期变化
myObserve.on('routerPageUpdate', (info) => {... })
}

//使用mypage埋点  存生命周期信息
function tracking(mypage: MyPage, windowname: string) {
  let stack: Stack<pageTracking> = mypagestack[windowname]
  // 1.存页面信息(abouttoappear),同时打印当前所有路径 打印当前栈的顺序
  // 如果当前栈元素为一个且当前元素为navd页面,仅修改对应页面的类型
  // 不入栈 ,而是将对应的栈顶元素的page类型改为navPage
  if (mypage.lifeCricle == 2) {...}
  // 2.更新页面信息 :onshown(刷新开始时间)
  else if (mypage.lifeCricle == 0) {
    // 改变方向:
    windows[windowname].setPreferredOrientation(pageOrientations[mypage.name as string])
  }
  // 3.更新页面信息 :onhidden(累计值 刷新停留时间)
  else if (mypage.lifeCricle == 1) {...}

  // 4.输出页面信息 abouttodistoappear 删除页面信息
  else if (mypage.lifeCricle == 3) {...}

}
分享
微博
QQ
微信
回复
2024-12-20 19:42:49
相关问题
基于tabs实现页面布局
917浏览 • 1回复 待解决
如何实现Page页面数据保留
2088浏览 • 1回复 待解决
如何实现page页面的横竖屏切换
994浏览 • 1回复 待解决
基于HarmonyOS实现H5离线方案哪些?
715浏览 • 1回复 待解决
HarmonyOS 如何实现Y轴旋转
420浏览 • 1回复 待解决
HarmonyOS 如何实现旋转动画
745浏览 • 1回复 待解决
HarmonyOS 如何实现旋转地球效果?
202浏览 • 1回复 待解决
如何实现图片裁剪、旋转
949浏览 • 1回复 待解决
基于measure实现文本测量
1171浏览 • 1回复 待解决
如何实现应用屏幕自动旋转
2694浏览 • 1回复 待解决
HarmonyOS 是否.9图实现效果
393浏览 • 1回复 待解决
HarmonyOS 如何实现半透明Page
589浏览 • 1回复 待解决
Page Ability 无法实现跳转
9282浏览 • 1回复 待解决
怎么基于Java实现视频播放?
3376浏览 • 1回复 待解决
摄像头获取到yuv数据是否旋转
1047浏览 • 1回复 待解决
基于原生实现高级显示效果
1041浏览 • 1回复 待解决