cuihai
cuihai
  • 发布:2026-06-11 17:30
  • 更新:2026-06-11 17:31
  • 阅读:34

怎么做到竖屏跳转横屏,横屏从右侧划入。原生安卓是这样的,uniapp怎么实现

分类:uni-app

我是只让单个页面横屏,竖屏跳转横屏页面后使用plus.screen.lockOrientation('landscape-primary'),让页面横屏,竖屏进入横屏时,页面会出现一瞬间上级页面和横屏页面同时出现,横屏返回时也是。原生app是横屏从右侧划入,返回时竖屏从上方划入,很丝滑

2026-06-11 17:30 负责人:无 分享
已邀请:
cuihai

cuihai (作者) - 程序员

这是页面效果

Ask小助手

Ask小助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

在 uni-app 的 App 端(安卓/iOS)实现竖屏跳转横屏时,出现页面闪烁、上一页和横屏页同时显示的问题,本质上是 Webview 转屏动画与页面跳转动画未协调导致的。

原生 App 的转场之所以丝滑,是因为横屏页面是作为一个新的 Activity(安卓)或 ViewController(iOS)从右侧划入的,系统处理了完整的转屏+转场动画。而 uni-app 默认情况下,所有页面运行在同一个 Webview 容器中,直接调用 plus.screen.lockOrientation 只是旋转了容器,页面切换仍沿用竖屏的动画逻辑。

结合知识库信息,uni-app 官方并没有提供直接封装好的“旋转并带转场动画”的 API,但我们可以通过以下 纯 Webview 方案 来最大程度优化体验。

方案:使用独立 Webview + 延迟动画优化(推荐)

核心思路是:不使用默认的 navigateTo 打开横屏页,而是创建一个新的独立 Webview 来承载横屏页面,并手动控制打开动画,使其从右侧划入。返回时同样控制关闭动画。

1. 配置 manifest.json
确保应用支持横竖屏,否则锁定横屏会无效。

// manifest.json -> "app-plus" -> "distribute" -> "android" 或 "ios"  
{  
  "app-plus" : {  
    "screenOrientation" : [  
      "portrait-primary",  
      "landscape-primary",  
      "landscape-secondary"  
    ]  
  }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

2. 竖屏页面(列表页)跳转逻辑
在跳转横屏页时,使用 plus.webview.create 创建一个新的 Webview,指定其位置从右侧屏幕外开始,并同时锁定屏幕方向。

// pages/list/list.vue  
methods: {  
  goToLandscape() {  
    // 1. 锁定屏幕为横屏  
    plus.screen.lockOrientation('landscape-primary');  

    // 2. 获取当前屏幕宽高(锁定后需延迟获取)  
    setTimeout(() => {  
      const screenWidth = plus.screen.resolutionWidth;  
      const screenHeight = plus.screen.resolutionHeight;  

      // 3. 创建新的横屏 Webview  
      let landscapeWebview = plus.webview.create(  
        '/pages/landscape/landscape', // 横屏页面路径  
        'landscape-page-id', // 唯一标识  
        {  
          // 初始位置在屏幕右侧之外  
          left: screenWidth + 'px',  
          top: '0px',  
          width: screenWidth + 'px',  
          height: screenHeight + 'px',  
          // 设置动画从右侧划入  
          animation: {  
            type: 'slide-in-right',  
            duration: 300  
          },  
          // 背景色避免白屏闪烁  
          background: '#000000'  
        }  
      );  

      // 4. 显示 Webview 并播放动画  
      landscapeWebview.show('slide-in-right', 300, () => {  
        // 动画完成后,可以将当前竖屏页隐藏,减少重叠感  
        plus.webview.currentWebview().hide();  
      });  
    }, 200);  
  }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

3. 横屏页面返回逻辑
在横屏页面中拦截返回操作,先恢复竖屏,再将当前 Webview 从右侧划出关闭,同时显示原来的竖屏页。

// pages/landscape/landscape.vue  
export default {  
  onBackPress(options) {  
    if (options.from === 'backbutton') {  
      this.goBackToPortrait();  
      return true; // 阻止默认行为  
    }  
  },  
  methods: {  
    goBackToPortrait() {  
      // 1. 恢复竖屏  
      plus.screen.lockOrientation('portrait-primary');  

      // 2. 获取竖屏页的 Webview  
      let portraitWebview = plus.webview.getWebviewById(plus.runtime.appid);  
      // 如果竖屏页被隐藏了,先显示出来  
      if (portraitWebview) {  
        portraitWebview.show();  
      }  

      // 3. 将当前横屏 Webview 从右侧划出关闭  
      let currentWebview = plus.webview.currentWebview();  
      currentWebview.close('slide-out-right', 300);  
    }  
  }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

4. 横屏页面 pages.json 配置

{  
  "path": "pages/landscape/landscape",  
  "style": {  
    "navigationBarTitleText": "横屏页面",  
    "app-plus": {  
      // 允许横竖屏自动适应  
      "pageOrientation": "landscape"  
    }  
  }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

为什么会出现闪烁和重叠?

  • 直接使用 navigateTo:uni-app 默认的页面切换动画(如从右侧推入)是在竖屏坐标系下计算的。当你先锁定横屏,系统需要旋转整个 Webview 容器,同时还要执行页面推入动画,两个动画同时进行就会导致视觉上的错乱和闪烁。
  • 独立 Webview 方案的优势:将横屏页面放在独立的 Webview 中,相当于模拟了原生 Activity 的行为。你可以自由控制这个 Webview 的初始位置和动画,避免与容器旋转动画冲突。

备选方案:使用原生插件

如果上述纯 Webview 方案仍不能满足你对“丝滑”的要求,可以考虑使用原生插件来实现真正的原生 Activity 跳转。你可以在插件市场搜索相关插件,例如:

注意事项

  • iOS 侧滑返回:在横屏页面,你可能需要禁用侧滑返回,否则会触发 popGesture 导致非预期的返回动画。可在 pages.json 中配置 "app-plus": {"popGesture": "none"},但根据知识库反馈,iOS 上有时需要在 Webview 层级处理,所以上述方案中手动拦截 onBackPress 是更稳妥的做法。
  • 页面返回时恢复竖屏:务必在离开横屏页面时调用 plus.screen.lockOrientation('portrait-primary'),否则上级竖屏页面会显示异常,这在 ask 社区 中也多次提及。

通过独立 Webview 管理横竖屏页面,你可以获得接近原生的转场体验。

内容为 AI 生成,仅供参考

要回复问题请先登录注册