|
|
@@ -116,10 +116,10 @@ export const getScreenSize = (): ScreenSize => {
|
|
|
|
|
|
/**
|
|
|
* 根据屏幕高度计算缩放比例
|
|
|
- * @param baseHeight 基准高度(设计稿高度,如 812px)
|
|
|
+ * @param baseHeight 基准高度(设计稿高度,如 852px)
|
|
|
* @returns 缩放比例 (0.7 - 1.0)
|
|
|
*/
|
|
|
-export const getScaleFactor = (baseHeight: number = 812): number => {
|
|
|
+export const getScaleFactor = (baseHeight: number = 852): number => {
|
|
|
const { height } = getScreenSize();
|
|
|
|
|
|
// 计算缩放比例,最小 0.7,最大 1.0
|
|
|
@@ -198,17 +198,17 @@ export const getLayoutParams = (): LayoutParams => {
|
|
|
progressRingPadding: 17, // 88 * 0.92 * 0.21 ≈ 17 (按比例缩放)
|
|
|
};
|
|
|
} else {
|
|
|
- // 正常屏幕:使用设计稿尺寸
|
|
|
+ // 正常屏幕:使用设计稿尺寸(393×852)
|
|
|
return {
|
|
|
avatarScale: 1.0,
|
|
|
- avatarTopOffset: 152,
|
|
|
- emotionTopOffset: 610,
|
|
|
- recordButtonTopOffset: 661,
|
|
|
- recordButtonSize: 96,
|
|
|
- waveformHeight: 56,
|
|
|
- verticalGap: 20,
|
|
|
- buttonGap: 35,
|
|
|
- progressRingPadding: 18, // 基准值:96 * 0.1875 = 18
|
|
|
+ avatarTopOffset: 160,
|
|
|
+ emotionTopOffset: 640,
|
|
|
+ recordButtonTopOffset: 693,
|
|
|
+ recordButtonSize: 101,
|
|
|
+ waveformHeight: 59,
|
|
|
+ verticalGap: 21,
|
|
|
+ buttonGap: 37,
|
|
|
+ progressRingPadding: 19,
|
|
|
};
|
|
|
}
|
|
|
};
|
|
|
@@ -264,52 +264,52 @@ export const updateTooSmallFlag = (): void => {
|
|
|
// ============================================================================
|
|
|
|
|
|
/**
|
|
|
- * 基准布局参数(设计稿:375×812)
|
|
|
+ * 基准布局参数(设计稿:393×852,由原 375×812 等比换算)
|
|
|
*/
|
|
|
const BASE_LAYOUT = {
|
|
|
// 视口
|
|
|
- baseWidth: 375,
|
|
|
- baseHeight: 812,
|
|
|
+ baseWidth: 393,
|
|
|
+ baseHeight: 852,
|
|
|
|
|
|
// 安全区域
|
|
|
- topSafeArea: 44, // 顶部安全区(状态栏)
|
|
|
- bottomSafeArea: 34, // ⚠️ 已废弃:底部安全区现在使用 detectBottomSafeArea() 动态检测
|
|
|
+ topSafeArea: 46, // 顶部安全区(状态栏)
|
|
|
+ bottomSafeArea: 36, // ⚠️ 已废弃:底部安全区现在使用 detectBottomSafeArea() 动态检测
|
|
|
|
|
|
// 进度环容器距离底部(设计稿基准)
|
|
|
- progressContainerBottom: 84, // 进度环容器距离视口底部的距离
|
|
|
+ progressContainerBottom: 88, // 进度环容器距离视口底部的距离
|
|
|
|
|
|
// AnimaZone 头像区域(新设计稿)
|
|
|
- avatarWidth: 343, // 设计稿宽度
|
|
|
- avatarHeight: 340, // 设计稿高度
|
|
|
- avatarTop: 248, // 距离顶部位置
|
|
|
- avatarContainerHeight: 478,
|
|
|
+ avatarWidth: 360, // 设计稿宽度
|
|
|
+ avatarHeight: 357, // 设计稿高度
|
|
|
+ avatarTop: 260, // 距离顶部位置
|
|
|
+ avatarContainerHeight: 502,
|
|
|
|
|
|
// 装饰元素
|
|
|
- treesWidth: 395,
|
|
|
- treesLeft: -26, // 设计稿中树木 left: -26px(向左偏移,部分超出屏幕)
|
|
|
- avatarCSize: 40,
|
|
|
+ treesWidth: 414,
|
|
|
+ treesLeft: -27, // 设计稿中树木 left(向左偏移,部分超出屏幕)
|
|
|
+ avatarCSize: 42,
|
|
|
|
|
|
// 情感标签
|
|
|
- emotionTop: 50, // 距离顶部位置
|
|
|
- emotionHeight: 36,
|
|
|
- emotionGap: 20, // 情感标签与头像的间距
|
|
|
+ emotionTop: 53, // 距离顶部位置
|
|
|
+ emotionHeight: 38,
|
|
|
+ emotionGap: 21, // 情感标签与头像的间距
|
|
|
|
|
|
// 录音按钮
|
|
|
- recordButtonSize: 96,
|
|
|
- recordButtonMinSize: 44,
|
|
|
+ recordButtonSize: 101,
|
|
|
+ recordButtonMinSize: 46,
|
|
|
|
|
|
- // 进度环(基于设计稿 375x812)
|
|
|
- progressRingPadding: 18,
|
|
|
- progressRingToAvatarGap: 26, // 进度环顶部距离头像底部的间距
|
|
|
- progressRingSize: 114, // 进度环容器尺寸
|
|
|
+ // 进度环(基于设计稿 393×852)
|
|
|
+ progressRingPadding: 19,
|
|
|
+ progressRingToAvatarGap: 27, // 进度环顶部距离头像底部的间距
|
|
|
+ progressRingSize: 120, // 进度环容器尺寸
|
|
|
|
|
|
// 波形图
|
|
|
- waveformHeight: 56,
|
|
|
+ waveformHeight: 59,
|
|
|
|
|
|
// 间距
|
|
|
- verticalGap: 20, // 波形与按钮的垂直间距
|
|
|
- buttonGap: 35, // 取消和发送按钮之间的水平间距(仅用于旧布局,V3 等比例版本中会根据按钮尺寸重新计算)
|
|
|
- minGapBetweenElements: 16, // 元素之间最小间距
|
|
|
+ verticalGap: 21, // 波形与按钮的垂直间距
|
|
|
+ buttonGap: 37, // 取消和发送按钮之间的水平间距(仅用于旧布局,V3 等比例版本中会根据按钮尺寸重新计算)
|
|
|
+ minGapBetweenElements: 17, // 元素之间最小间距
|
|
|
} as const;
|
|
|
|
|
|
/**
|
|
|
@@ -372,7 +372,7 @@ export interface CalculatedLayout {
|
|
|
/**
|
|
|
* 完全计算式布局系统 - V3.0 等比例缩放版本
|
|
|
*
|
|
|
- * 基于 375×812 基准设计稿,进行等比例缩放适配
|
|
|
+ * 基于 393×852 基准设计稿,进行等比例缩放适配
|
|
|
*
|
|
|
* @param viewportWidth 视口宽度
|
|
|
* @param viewportHeight 视口高度
|
|
|
@@ -429,9 +429,9 @@ export function calculateLayout(
|
|
|
|
|
|
// 6. 计算各元素位置(等比例缩放,基于设计稿位置)
|
|
|
// 所有位置按相同缩放比例计算,保持设计稿布局
|
|
|
- const avatarCTop = Math.round(63 * scale); // 设计稿中 Avatar-C 距顶部 63px
|
|
|
- const avatarCRight = Math.round(33 * scale); // 设计稿中 Avatar-C 距右侧 33px
|
|
|
- const treesTop = Math.round(175 * scale); // 设计稿中树木距顶部 175px
|
|
|
+ const avatarCTop = Math.round(66 * scale); // 设计稿中 Avatar-C 距顶部(393×852)
|
|
|
+ const avatarCRight = Math.round(35 * scale); // 设计稿中 Avatar-C 距右侧
|
|
|
+ const treesTop = Math.round(184 * scale); // 设计稿中树木距顶部
|
|
|
const treesLeft = Math.round(BASE.treesLeft * scale); // 设计稿中树木 left: -26px(自适应)
|
|
|
const animaZoneTop = Math.round(BASE.avatarTop * scale); // 设计稿中头像距顶部 248px
|
|
|
const mainAvatarTop = topSafeArea; // 头像区域从安全区域开始
|
|
|
@@ -468,32 +468,29 @@ export function calculateLayout(
|
|
|
const recordButtonOffset = (progressRingSize - recordButtonSize) / 2 + baseOffset;
|
|
|
|
|
|
// 10. Tooltips 位置和尺寸(等比例缩放)
|
|
|
- // 设计稿基准值(375×812)
|
|
|
+ // 设计稿基准值(393×852)
|
|
|
// 计算 tapToChat 相对于录音按钮的偏移量
|
|
|
- // 设计稿基准:录音按钮 96×96,TapToChat 128px 宽
|
|
|
- // top: 相对于录音按钮顶部向上偏移 74px
|
|
|
- // left: 相对于录音按钮左边缘向右偏移 83px(设计稿基准值)
|
|
|
- const tapToChatWidth = Math.round(128 * scale);
|
|
|
- const tapToChatLeftOffset = Math.round(83 * scale); // 从录音按钮左边缘到 TapToChat 左边缘的距离
|
|
|
+ const tapToChatWidth = Math.round(134 * scale);
|
|
|
+ const tapToChatLeftOffset = Math.round(87 * scale); // 从录音按钮左边缘到 TapToChat 左边缘的距离
|
|
|
|
|
|
const tooltips = {
|
|
|
// 进度条提示:相对于录音按钮左上顶点定位(top: 图片高度的一半的负值,left: 图片宽度的一半的负值)
|
|
|
progressBar: {
|
|
|
- width: Math.round(167 * scale),
|
|
|
- height: Math.round(130.35 * scale),
|
|
|
- top: -Math.round(130.35 * scale) / 2, // 图片高度的一半的负值
|
|
|
- left: -Math.round(167 * scale) / 2, // 图片宽度的一半的负值
|
|
|
+ width: Math.round(175 * scale),
|
|
|
+ height: Math.round(137 * scale),
|
|
|
+ top: -Math.round(137 * scale) / 2, // 图片高度的一半的负值
|
|
|
+ left: -Math.round(175 * scale) / 2, // 图片宽度的一半的负值
|
|
|
},
|
|
|
- // Tap to Chat:相对于录音按钮定位(top 向上偏移 74px,left 从左边缘向右偏移 83px)
|
|
|
+ // Tap to Chat:相对于录音按钮定位
|
|
|
tapToChat: {
|
|
|
width: tapToChatWidth,
|
|
|
height: 0, // auto
|
|
|
- top: Math.round(-74 * scale), // 相对于录音按钮顶部向上偏移
|
|
|
+ top: Math.round(-78 * scale), // 相对于录音按钮顶部向上偏移
|
|
|
left: tapToChatLeftOffset, // 相对于录音按钮左边缘向右偏移
|
|
|
},
|
|
|
// 取消按钮提示:使用百分比定位(tooltip 放在按钮容器内)
|
|
|
cancel: {
|
|
|
- width: Math.round(110 * scale),
|
|
|
+ width: Math.round(115 * scale),
|
|
|
height: 0, // auto
|
|
|
// bottom: 110% - tooltip 底部在按钮底部下方 10% 的位置
|
|
|
bottom: '110%',
|
|
|
@@ -502,7 +499,7 @@ export function calculateLayout(
|
|
|
},
|
|
|
// 发送按钮提示:使用百分比定位(tooltip 放在按钮容器内)
|
|
|
send: {
|
|
|
- width: Math.round(111 * scale),
|
|
|
+ width: Math.round(116 * scale),
|
|
|
height: 0, // auto
|
|
|
// bottom: 110% - tooltip 底部在按钮底部下方 10% 的位置
|
|
|
bottom: '110%',
|