头像入版 页面跳转优化
This commit is contained in:
@@ -91,12 +91,11 @@ export class SceneBgVideoLayer extends li_BaseView {
|
||||
loop: options?.loop ?? true,
|
||||
size: options?.size,
|
||||
position: options?.position,
|
||||
scale: options?.scale,
|
||||
};
|
||||
|
||||
// 先停止当前视频
|
||||
if (this.isPlaying) {
|
||||
this.stop();
|
||||
this.pause();
|
||||
}
|
||||
|
||||
// 加载本地视频资源
|
||||
@@ -106,21 +105,52 @@ export class SceneBgVideoLayer extends li_BaseView {
|
||||
"Girls",
|
||||
(res: VideoClip) => {
|
||||
this.videoPlayer.loop = config.loop;
|
||||
|
||||
|
||||
// 设置锚点为中心,确保位置对齐
|
||||
const uiTransform = this.videoPlayer.node.getComponent(UITransform);
|
||||
if (uiTransform) {
|
||||
uiTransform.setAnchorPoint(0.5, 0.5);
|
||||
console.log("SceneBgVideoLayer: 设置视频锚点为 (0.5, 0.5)");
|
||||
}
|
||||
|
||||
// 应用位置设置(使用世界坐标)
|
||||
|
||||
// 应用位置设置(先尝试本地坐标,再尝试世界坐标)
|
||||
if (config.position) {
|
||||
const pos = config.position;
|
||||
let targetWorldPos: Vec3;
|
||||
if (pos instanceof Vec3) {
|
||||
this.videoPlayer.node.setWorldPosition(pos);
|
||||
targetWorldPos = pos;
|
||||
} else {
|
||||
this.videoPlayer.node.setWorldPosition(pos.x, pos.y, pos.z || 0);
|
||||
targetWorldPos = new Vec3(pos.x, pos.y, pos.z || 0);
|
||||
}
|
||||
|
||||
// 获取 videoPlayer 的父节点信息
|
||||
const parent = this.videoPlayer.node.parent;
|
||||
if (parent) {
|
||||
const parentWorldPos = parent.getWorldPosition();
|
||||
const parentWorldScale = parent.getWorldScale();
|
||||
console.log(`SceneBgVideoLayer: VideoPlayer 父节点世界位置: (${parentWorldPos.x}, ${parentWorldPos.y}, ${parentWorldPos.z})`);
|
||||
console.log(`SceneBgVideoLayer: VideoPlayer 父节点世界缩放: (${parentWorldScale.x}, ${parentWorldScale.y}, ${parentWorldScale.z})`);
|
||||
|
||||
// 尝试方法1:计算相对于父节点的本地位置
|
||||
const localPos = new Vec3();
|
||||
localPos.x = (targetWorldPos.x - parentWorldPos.x) / parentWorldScale.x;
|
||||
localPos.y = (targetWorldPos.y - parentWorldPos.y) / parentWorldScale.y;
|
||||
localPos.z = (targetWorldPos.z - parentWorldPos.z) / parentWorldScale.z;
|
||||
|
||||
this.videoPlayer.node.setPosition(localPos);
|
||||
console.log(`SceneBgVideoLayer: 设置本地位置: (${localPos.x.toFixed(2)}, ${localPos.y.toFixed(2)}, ${localPos.z.toFixed(2)})`);
|
||||
} else {
|
||||
// 如果没有父节点,直接使用世界坐标
|
||||
this.videoPlayer.node.setWorldPosition(targetWorldPos);
|
||||
console.log(`SceneBgVideoLayer: 无父节点,使用世界坐标: (${targetWorldPos.x}, ${targetWorldPos.y}, ${targetWorldPos.z})`);
|
||||
}
|
||||
|
||||
// 验证位置是否设置正确
|
||||
const actualWorldPos = this.videoPlayer.node.getWorldPosition();
|
||||
const actualLocalPos = this.videoPlayer.node.getPosition();
|
||||
console.log(`SceneBgVideoLayer: 目标世界位置: (${targetWorldPos.x}, ${targetWorldPos.y}, ${targetWorldPos.z})`);
|
||||
console.log(`SceneBgVideoLayer: 实际世界位置: (${actualWorldPos.x}, ${actualWorldPos.y}, ${actualWorldPos.z})`);
|
||||
console.log(`SceneBgVideoLayer: 实际本地位置: (${actualLocalPos.x.toFixed(2)}, ${actualLocalPos.y.toFixed(2)}, ${actualLocalPos.z.toFixed(2)})`);
|
||||
}
|
||||
|
||||
// 如果传入了目标尺寸,计算并应用缩放
|
||||
@@ -128,48 +158,93 @@ export class SceneBgVideoLayer extends li_BaseView {
|
||||
// 获取视频的原始尺寸
|
||||
const videoWidth = uiTransform.contentSize.width;
|
||||
const videoHeight = uiTransform.contentSize.height;
|
||||
|
||||
|
||||
if (videoWidth > 0 && videoHeight > 0) {
|
||||
const targetWidth = config.size instanceof Size ? config.size.width : config.size.width;
|
||||
const targetHeight = config.size instanceof Size ? config.size.height : config.size.height;
|
||||
|
||||
const targetWidth =
|
||||
config.size instanceof Size
|
||||
? config.size.width
|
||||
: config.size.width;
|
||||
const targetHeight =
|
||||
config.size instanceof Size
|
||||
? config.size.height
|
||||
: config.size.height;
|
||||
|
||||
// 计算缩放比例(填满整个区域)
|
||||
const scaleX = targetWidth / videoWidth;
|
||||
const scaleY = targetHeight / videoHeight;
|
||||
const scale = Math.max(scaleX, scaleY);
|
||||
|
||||
|
||||
this.videoPlayer.node.setScale(new Vec3(scale, scale, 1));
|
||||
console.log(`SceneBgVideoLayer: 视频原始尺寸: ${videoWidth}x${videoHeight}, 目标尺寸: ${targetWidth}x${targetHeight}, 缩放: ${scale}`);
|
||||
console.log(
|
||||
`SceneBgVideoLayer: 视频原始尺寸: ${videoWidth}x${videoHeight}, 目标尺寸: ${targetWidth}x${targetHeight}`
|
||||
);
|
||||
console.log(
|
||||
`SceneBgVideoLayer: 缩放比例 - X: ${scaleX.toFixed(3)}, Y: ${scaleY.toFixed(3)}, 最终: ${scale.toFixed(3)}`
|
||||
);
|
||||
} else {
|
||||
// 如果视频尺寸还未准备好,延迟重试
|
||||
this.scheduleOnce(() => {
|
||||
if (config.size && uiTransform) {
|
||||
const videoWidth = uiTransform.contentSize.width;
|
||||
const videoHeight = uiTransform.contentSize.height;
|
||||
|
||||
|
||||
if (videoWidth > 0 && videoHeight > 0) {
|
||||
const targetWidth = config.size instanceof Size ? config.size.width : config.size.width;
|
||||
const targetHeight = config.size instanceof Size ? config.size.height : config.size.height;
|
||||
|
||||
const targetWidth =
|
||||
config.size instanceof Size
|
||||
? config.size.width
|
||||
: config.size.width;
|
||||
const targetHeight =
|
||||
config.size instanceof Size
|
||||
? config.size.height
|
||||
: config.size.height;
|
||||
|
||||
const scaleX = targetWidth / videoWidth;
|
||||
const scaleY = targetHeight / videoHeight;
|
||||
const scale = Math.max(scaleX, scaleY);
|
||||
|
||||
|
||||
this.videoPlayer.node.setScale(new Vec3(scale, scale, 1));
|
||||
console.log(`SceneBgVideoLayer: (延迟) 视频原始尺寸: ${videoWidth}x${videoHeight}, 目标尺寸: ${targetWidth}x${targetHeight}, 缩放: ${scale}`);
|
||||
console.log(
|
||||
`SceneBgVideoLayer: (延迟) 视频原始尺寸: ${videoWidth}x${videoHeight}, 目标尺寸: ${targetWidth}x${targetHeight}`
|
||||
);
|
||||
console.log(
|
||||
`SceneBgVideoLayer: (延迟) 缩放比例 - X: ${scaleX.toFixed(3)}, Y: ${scaleY.toFixed(3)}, 最终: ${scale.toFixed(3)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
}, 0.1);
|
||||
}
|
||||
} else {
|
||||
// 没有指定尺寸,保持原始缩放
|
||||
this.videoPlayer.node.setScale(Vec3.ONE);
|
||||
console.log("SceneBgVideoLayer: 未指定尺寸,保持默认缩放 (1, 1, 1)");
|
||||
}
|
||||
// 如果显式传入了 scale 参数,覆盖自动计算的缩放
|
||||
else if (config.scale !== undefined) {
|
||||
this.setVideoScale(config.scale);
|
||||
}
|
||||
|
||||
this.videoPlayer.play();
|
||||
this.isPlaying = true;
|
||||
console.log(`SceneBgVideoLayer: 播放视频 ${path}, 配置:`, config);
|
||||
|
||||
// 最终验证:确保视频节点的状态正确
|
||||
setTimeout(() => {
|
||||
const finalWorldPos = this.videoPlayer.node.getWorldPosition();
|
||||
const finalLocalPos = this.videoPlayer.node.getPosition();
|
||||
const finalScale = this.videoPlayer.node.getScale();
|
||||
const finalTransform = this.videoPlayer.node.getComponent(UITransform);
|
||||
if (finalTransform) {
|
||||
console.log(`SceneBgVideoLayer: === 最终状态验证 ===`);
|
||||
console.log(`SceneBgVideoLayer: 最终世界位置: (${finalWorldPos.x.toFixed(2)}, ${finalWorldPos.y.toFixed(2)}, ${finalWorldPos.z.toFixed(2)})`);
|
||||
console.log(`SceneBgVideoLayer: 最终本地位置: (${finalLocalPos.x.toFixed(2)}, ${finalLocalPos.y.toFixed(2)}, ${finalLocalPos.z.toFixed(2)})`);
|
||||
console.log(`SceneBgVideoLayer: 最终缩放: (${finalScale.x.toFixed(3)}, ${finalScale.y.toFixed(3)}, ${finalScale.z.toFixed(3)})`);
|
||||
console.log(`SceneBgVideoLayer: 最终锚点: (${finalTransform.anchorX.toFixed(2)}, ${finalTransform.anchorY.toFixed(2)})`);
|
||||
console.log(`SceneBgVideoLayer: 最终内容尺寸: ${finalTransform.contentSize.width.toFixed(0)}x${finalTransform.contentSize.height.toFixed(0)}`);
|
||||
|
||||
// 计算实际渲染尺寸(内容尺寸 * 缩放)
|
||||
const renderWidth = finalTransform.contentSize.width * finalScale.x;
|
||||
const renderHeight = finalTransform.contentSize.height * finalScale.y;
|
||||
console.log(`SceneBgVideoLayer: 计算的渲染尺寸: ${renderWidth.toFixed(0)}x${renderHeight.toFixed(0)}`);
|
||||
console.log(`SceneBgVideoLayer: === 验证结束 ===`);
|
||||
}
|
||||
}, 200);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user