From e3131cfe1a11f66933fa4cc42a40feed641268a0 Mon Sep 17 00:00:00 2001 From: Kohei Date: Sun, 22 Feb 2026 00:37:28 +0900 Subject: [PATCH] fix: make speaking waveform animation loop seamlessly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The animPhase multiplier 1.5 caused sin(x+3π)=-sin(x) at loop restart, creating a visible jump. Changed to integer multiplier 2 so the wave returns to its initial state (sin(x+4π)=sin(x)) for a smooth loop. Co-Authored-By: Claude Opus 4.6 --- .../picoclaw/android/feature/chat/assistant/AssistantPillBar.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantPillBar.kt b/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantPillBar.kt index 3a3c55fff..cfde64219 100644 --- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantPillBar.kt +++ b/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantPillBar.kt @@ -352,7 +352,7 @@ private fun WaveformBar( (0.2f + 0.15f * ((wave + 1f) / 2f)) * size.height } VoicePhase.SPEAKING -> { - val wave = sin(normalizedX * 5f * PI.toFloat() + animPhase * 1.5f) + val wave = sin(normalizedX * 5f * PI.toFloat() + animPhase * 2f) (0.2f + 0.4f * ((wave + 1f) / 2f)) * size.height } else -> 0.1f * size.height