From f8587b1dd9def060a72bc7c2efb840beaf615045 Mon Sep 17 00:00:00 2001 From: X1a0He Date: Sun, 20 Jul 2025 01:52:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=E4=B8=91=E9=99=8B=E7=9A=84=20Helper=20=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=91=BC=E5=90=B8=E7=81=AF=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Adobe Downloader/Views/AboutView.swift | 79 +++++++++++++++++++------- 1 file changed, 59 insertions(+), 20 deletions(-) diff --git a/Adobe Downloader/Views/AboutView.swift b/Adobe Downloader/Views/AboutView.swift index 3b8af35..c468e2a 100644 --- a/Adobe Downloader/Views/AboutView.swift +++ b/Adobe Downloader/Views/AboutView.swift @@ -127,34 +127,73 @@ struct AboutAppView: View { struct PulsingCircle: View { let color: Color - @State private var pulsing = false + @State private var isAnimating = false var body: some View { ZStack { - ZStack(alignment: .center) { - Circle() - .fill(color) - .frame(width: 6, height: 6) + Circle() + .fill(color.opacity(0.15)) + .frame(width: isAnimating ? 20 : 8, height: isAnimating ? 20 : 8) + .opacity(isAnimating ? 0 : 0.8) + .animation( + .easeOut(duration: 2.5) + .repeatForever(autoreverses: false), + value: isAnimating + ) - Circle() - .stroke(color, lineWidth: 1) - .frame(width: pulsing ? 14 : 8, height: pulsing ? 14 : 8) - .opacity(pulsing ? 0 : 0.8) + Circle() + .fill(color.opacity(0.3)) + .frame(width: isAnimating ? 14 : 6, height: isAnimating ? 14 : 6) + .opacity(isAnimating ? 0 : 0.7) + .animation( + .easeOut(duration: 2.0) + .delay(0.4) + .repeatForever(autoreverses: false), + value: isAnimating + ) - Circle() - .stroke(color, lineWidth: 1) - .frame(width: pulsing ? 12 : 6, height: pulsing ? 12 : 6) - .opacity(pulsing ? 0.2 : 0.6) - } - .frame(width: 16, height: 16) + Circle() + .fill(color) + .frame(width: 6, height: 6) + .scaleEffect(isAnimating ? 1.15 : 1.0) + .opacity(0.95) + .animation( + .easeInOut(duration: 1.8) + .repeatForever(autoreverses: true), + value: isAnimating + ) + + Circle() + .fill( + RadialGradient( + gradient: Gradient(colors: [ + color.opacity(0.8), + color.opacity(0.3), + Color.clear + ]), + center: .center, + startRadius: 1, + endRadius: 4 + ) + ) + .frame(width: 8, height: 8) + .scaleEffect(isAnimating ? 1.3 : 0.8) + .opacity(isAnimating ? 0.6 : 1.0) + .animation( + .easeInOut(duration: 2.2) + .repeatForever(autoreverses: true), + value: isAnimating + ) } - .frame(width: 16, height: 16, alignment: .center) - .clipped() + .frame(width: 16, height: 16) .onAppear { - withAnimation(Animation.easeOut(duration: 1.5).repeatForever(autoreverses: false)) { - pulsing = true + withAnimation { + isAnimating = true } } + .onDisappear { + isAnimating = false + } } } @@ -913,7 +952,7 @@ struct HelperStatusRow: View { HStack(alignment: .center, spacing: 5) { PulsingCircle(color: helperStatusColor) .layoutPriority(1) - + Text(helperStatusText) .font(.system(size: 14)) .foregroundColor(helperStatusColor)