You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose实现视频通话视图切换:点击Box缩放+层级切换带动画

实现视频通话界面的画面切换与平滑动画效果

核心思路

通过CSS过渡动画配合状态切换,实现两个视频窗口的尺寸、位置、层级互换,同时保证动画平滑自然。


1. 布局结构设计

先搭建基础容器与两个视频Box,用绝对定位实现窗口叠加:

<div class="video-container">
  <!-- 远程摄像头画面(绿色) -->
  <div class="video-box remote-video"></div>
  <!-- 本地摄像头画面(黑色) -->
  <div class="video-box local-video"></div>
</div>

2. 基础样式与过渡配置

给容器和视频Box设置定位规则,同时给所有要变化的属性添加过渡效果:

/* 容器:作为两个视频Box的定位基准 */
.video-container {
  position: relative;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
}

/* 通用视频Box样式:统一过渡规则 */
.video-box {
  position: absolute;
  /* 让尺寸、位置、层级变化都平滑过渡 */
  transition: all 0.3s ease;
  border-radius: 8px;
}

/* 初始状态:远程画面占满全屏,层级较低 */
.remote-video {
  width: 100%;
  height: 100%;
  background-color: #2ecc71;
  z-index: 1;
}

/* 初始状态:本地画面小尺寸悬浮在右下角,层级更高(避免被远程画面遮挡) */
.local-video {
  width: 200px;
  height: 150px;
  bottom: 20px;
  right: 20px;
  background-color: #000;
  z-index: 2;
  cursor: pointer; /* 提示可点击 */
}

3. 切换状态样式

定义切换后的尺寸、位置和层级:

/* 切换后:远程画面变小,移到右下角,层级变高 */
.remote-video.small {
  width: 200px;
  height: 150px;
  bottom: 20px;
  right: 20px;
  z-index: 2;
}

/* 切换后:本地画面占满全屏,层级变低 */
.local-video.full {
  width: 100%;
  height: 100%;
  bottom: 0;
  right: 0;
  z-index: 1;
}

4. 交互逻辑实现

通过点击事件切换类名,触发状态变化与动画:

const localVideo = document.querySelector('.local-video');
const remoteVideo = document.querySelector('.remote-video');

localVideo.addEventListener('click', () => {
  // 切换类名,触发CSS定义的状态变化
  localVideo.classList.toggle('full');
  remoteVideo.classList.toggle('small');
});

优化细节

  • 若想让动画更自然,可调整transition的缓动函数(比如cubic-bezier(0.4, 0, 0.2, 1))或过渡时长(比如0.4s)。
  • 如果需要基于中心点缩放,可给.video-box添加transform-origin: center center,配合transform: scale()实现,但用位置+尺寸的方式更适配窗口边角的场景。
  • 若使用React/Vue等框架,可将切换状态用组件状态(比如useState、data)管理,通过条件渲染类名替代原生JS操作。

内容的提问来源于stack exchange,提问作者Harish Padmanabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:30:58