diff --git a/src/views/GroupEvolution/components/wordsCloud.vue b/src/views/GroupEvolution/components/wordsCloud.vue index 71b2be5..a5e18f4 100644 --- a/src/views/GroupEvolution/components/wordsCloud.vue +++ b/src/views/GroupEvolution/components/wordsCloud.vue @@ -43,6 +43,8 @@ const scanAngle = ref(0) const scanTimer = ref(null) const containerWidth = 350 const containerHeight = 276 +// 添加状态变量跟踪是否已完成第一个周期 +const hasCompletedFirstCycle = ref(false) const words = ref(props.wordsCloudList) @@ -80,17 +82,31 @@ const startScan = () => { const progress = (elapsedTime / duration) % 1 const newScanAngle = progress * 360 + // 只在第一个周期结束时执行一次重置 if (newScanAngle < scanAngle.value) { - words.value.forEach((w) => (w.visible = false)) - startTime = timestamp + if (!hasCompletedFirstCycle.value) { + // 第一个周期结束,标记为已完成 + hasCompletedFirstCycle.value = true + } else { + // 后续周期不再重置词语可见性 + // 但仍需更新startTime以保持动画流畅 + startTime = timestamp + } } scanAngle.value = newScanAngle - words.value.forEach((word) => { - if (!word.visible && scanAngle.value >= word.angle) { + // 始终显示所有词语(第一个周期后)或根据扫描角度显示(第一个周期) + if (hasCompletedFirstCycle.value) { + words.value.forEach((word) => { word.visible = true - } - }) + }) + } else { + words.value.forEach((word) => { + if (!word.visible && scanAngle.value >= word.angle) { + word.visible = true + } + }) + } scanTimer.value = requestAnimationFrame(animate) } diff --git a/src/views/KeyNodeDiscern/components/WordCloud.vue b/src/views/KeyNodeDiscern/components/WordCloud.vue index 85be0f7..9223a80 100644 --- a/src/views/KeyNodeDiscern/components/WordCloud.vue +++ b/src/views/KeyNodeDiscern/components/WordCloud.vue @@ -44,6 +44,7 @@ const scanAngle = ref(0) const scanTimer = ref(null) const containerWidth = 370 const containerHeight = 257 +const hasCompletedFirstCycle = ref(false) // 添加新状态跟踪是否完成第一个周期 const words = ref(props.wordsCloudList) @@ -82,16 +83,28 @@ const startScan = () => { const newScanAngle = progress * 360 if (newScanAngle < scanAngle.value) { - words.value.forEach((w) => (w.visible = false)) + // 只在第一个周期结束时执行一次隐藏操作 + if (!hasCompletedFirstCycle.value) { + words.value.forEach((w) => (w.visible = false)) + hasCompletedFirstCycle.value = true // 标记已完成第一个周期 + } startTime = timestamp } scanAngle.value = newScanAngle - words.value.forEach((word) => { - if (!word.visible && scanAngle.value >= word.angle) { + // 只有在第一个周期内才根据角度显示词语 + if (!hasCompletedFirstCycle.value) { + words.value.forEach((word) => { + if (!word.visible && scanAngle.value >= word.angle) { + word.visible = true + } + }) + } else { + // 第一个周期结束后,所有词语保持可见 + words.value.forEach((word) => { word.visible = true - } - }) + }) + } scanTimer.value = requestAnimationFrame(animate) } diff --git a/src/views/LinkPrediction/components/cloudWords.vue b/src/views/LinkPrediction/components/cloudWords.vue index a35ead5..15faa80 100644 --- a/src/views/LinkPrediction/components/cloudWords.vue +++ b/src/views/LinkPrediction/components/cloudWords.vue @@ -44,6 +44,7 @@ const scanAngle = ref(0) const scanTimer = ref(null) const containerWidth = 370 const containerHeight = 276 +const hasCompletedFirstCycle = ref(false) // 添加新状态跟踪是否完成第一个周期 const words = ref(props.wordsCloudList) @@ -82,16 +83,28 @@ const startScan = () => { const newScanAngle = progress * 360 if (newScanAngle < scanAngle.value) { - words.value.forEach((w) => (w.visible = false)) + // 只在第一个周期结束时执行一次隐藏操作 + if (!hasCompletedFirstCycle.value) { + words.value.forEach((w) => (w.visible = false)) + hasCompletedFirstCycle.value = true // 标记已完成第一个周期 + } startTime = timestamp } scanAngle.value = newScanAngle - words.value.forEach((word) => { - if (!word.visible && scanAngle.value >= word.angle) { + // 只有在第一个周期内才根据角度显示词语 + if (!hasCompletedFirstCycle.value) { + words.value.forEach((word) => { + if (!word.visible && scanAngle.value >= word.angle) { + word.visible = true + } + }) + } else { + // 第一个周期结束后,所有词语保持可见 + words.value.forEach((word) => { word.visible = true - } - }) + }) + } scanTimer.value = requestAnimationFrame(animate) } diff --git a/src/views/LinkPrediction/socialGroups/components/cloudWords.vue b/src/views/LinkPrediction/socialGroups/components/cloudWords.vue index a35ead5..15faa80 100644 --- a/src/views/LinkPrediction/socialGroups/components/cloudWords.vue +++ b/src/views/LinkPrediction/socialGroups/components/cloudWords.vue @@ -44,6 +44,7 @@ const scanAngle = ref(0) const scanTimer = ref(null) const containerWidth = 370 const containerHeight = 276 +const hasCompletedFirstCycle = ref(false) // 添加新状态跟踪是否完成第一个周期 const words = ref(props.wordsCloudList) @@ -82,16 +83,28 @@ const startScan = () => { const newScanAngle = progress * 360 if (newScanAngle < scanAngle.value) { - words.value.forEach((w) => (w.visible = false)) + // 只在第一个周期结束时执行一次隐藏操作 + if (!hasCompletedFirstCycle.value) { + words.value.forEach((w) => (w.visible = false)) + hasCompletedFirstCycle.value = true // 标记已完成第一个周期 + } startTime = timestamp } scanAngle.value = newScanAngle - words.value.forEach((word) => { - if (!word.visible && scanAngle.value >= word.angle) { + // 只有在第一个周期内才根据角度显示词语 + if (!hasCompletedFirstCycle.value) { + words.value.forEach((word) => { + if (!word.visible && scanAngle.value >= word.angle) { + word.visible = true + } + }) + } else { + // 第一个周期结束后,所有词语保持可见 + words.value.forEach((word) => { word.visible = true - } - }) + }) + } scanTimer.value = requestAnimationFrame(animate) }