From 794079f20b85db6a4f1ec5a5ccf5a57f1c70e5ba Mon Sep 17 00:00:00 2001 From: Zhe Fang Date: Sun, 30 Nov 2025 11:00:05 -0500 Subject: [PATCH] fix: album art corner radius load delay --- .../BetterLyrics.WinUI3/Constants/Time.cs | 2 +- .../LyricsBackgroundSettingsControl.xaml | 15 ++ .../Controls/NowPlayingCanvas.xaml.cs | 5 +- .../Enums/SpectrumStyle.cs | 12 ++ .../Helper/SpectrumAnalyzer.cs | 2 +- .../Settings/LyricsBackgroundSettings.cs | 2 + .../Renderer/FluidBackgroundRenderer.cs | 2 +- .../Renderer/FogRenderer.cs | 2 +- .../Renderer/SnowRenderer.cs | 2 +- .../Renderer/SpectrumRenderer.cs | 129 ++++++++++++------ .../Strings/en-US/Resources.resw | 9 ++ .../Strings/ja-JP/Resources.resw | 18 +-- .../Strings/ko-KR/Resources.resw | 18 +-- .../Strings/zh-CN/Resources.resw | 18 +-- .../Strings/zh-TW/Resources.resw | 18 +-- .../BetterLyrics.WinUI3/Views/LyricsPage.xaml | 5 +- .../Views/LyricsPage.xaml.cs | 4 + 17 files changed, 178 insertions(+), 85 deletions(-) create mode 100644 BetterLyrics.WinUI3/BetterLyrics.WinUI3/Enums/SpectrumStyle.cs diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Constants/Time.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Constants/Time.cs index d4ff786..4fbf794 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Constants/Time.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Constants/Time.cs @@ -5,6 +5,6 @@ namespace BetterLyrics.WinUI3.Constants public static class Time { public static readonly TimeSpan DebounceTimeout = TimeSpan.FromMilliseconds(250); - public static readonly TimeSpan AnimationDuration = TimeSpan.FromMilliseconds(250); + public static readonly TimeSpan AnimationDuration = TimeSpan.FromMilliseconds(350); } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsBackgroundSettingsControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsBackgroundSettingsControl.xaml index 86bb611..d6da450 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsBackgroundSettingsControl.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsBackgroundSettingsControl.xaml @@ -117,6 +117,21 @@ + + + + + + + + + + + diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/NowPlayingCanvas.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/NowPlayingCanvas.xaml.cs index 711f6a6..e3b1a1a 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/NowPlayingCanvas.xaml.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/NowPlayingCanvas.xaml.cs @@ -301,9 +301,10 @@ namespace BetterLyrics.WinUI3.Controls resourceCreator: sender, ds: args.DrawingSession, spectrumData: _spectrumAnalyzer?.SmoothSpectrum, - barCount: _spectrumAnalyzer?.BarCount ?? 0, + barCount: _spectrumAnalyzer?.BarCount ?? 1, isEnabled: lyricsBg.IsSpectrumOverlayEnabled, placement: lyricsBg.SpectrumPlacement, + style: lyricsBg.SpectrumStyle, canvasWidth: sender.Size.Width, canvasHeight: sender.Size.Height, fillColor: lyricsThemeColors.BgFontColor @@ -422,7 +423,7 @@ namespace BetterLyrics.WinUI3.Controls if (lyricsBg.IsSpectrumOverlayEnabled && !_spectrumAnalyzer.IsCapturing) { - _spectrumAnalyzer.BarCount = 64; + _spectrumAnalyzer.BarCount = lyricsBg.SpectrumCount; _spectrumAnalyzer.StartCapture(); } else if (!lyricsBg.IsSpectrumOverlayEnabled && _spectrumAnalyzer.IsCapturing) diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Enums/SpectrumStyle.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Enums/SpectrumStyle.cs new file mode 100644 index 0000000..d78725a --- /dev/null +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Enums/SpectrumStyle.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BetterLyrics.WinUI3.Enums +{ + public enum SpectrumStyle + { + Curve, + Bar + } +} diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SpectrumAnalyzer.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SpectrumAnalyzer.cs index 034ab2a..abbbf79 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SpectrumAnalyzer.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/SpectrumAnalyzer.cs @@ -29,7 +29,7 @@ namespace BetterLyrics.WinUI3.Helper private float[]? _currentSpectrum; public float[]? SmoothSpectrum { get; private set; } - public int BarCount { get; set; } = 16; + public int BarCount { get; set; } = 64; public int Sensitivity { get; set; } = 100; public float SmoothingFactor { get; set; } = 0.95f; public bool IsCapturing { get; private set; } = false; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsBackgroundSettings.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsBackgroundSettings.cs index 94d5329..366c6e9 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsBackgroundSettings.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Models/Settings/LyricsBackgroundSettings.cs @@ -18,6 +18,8 @@ namespace BetterLyrics.WinUI3.Models.Settings [ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsSpectrumOverlayEnabled { get; set; } = false; [ObservableProperty][NotifyPropertyChangedRecipients] public partial SpectrumPlacement SpectrumPlacement { get; set; } = SpectrumPlacement.Bottom; + [ObservableProperty][NotifyPropertyChangedRecipients] public partial SpectrumStyle SpectrumStyle { get; set; } = SpectrumStyle.Bar; + [ObservableProperty][NotifyPropertyChangedRecipients] public partial int SpectrumCount { get; set; } = 128; [ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsSnowFlakeOverlayEnabled { get; set; } = false; [ObservableProperty][NotifyPropertyChangedRecipients] public partial int SnowFlakeOverlayAmount { get; set; } = 10; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/FluidBackgroundRenderer.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/FluidBackgroundRenderer.cs index e7be281..4b4bec7 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/FluidBackgroundRenderer.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/FluidBackgroundRenderer.cs @@ -13,7 +13,7 @@ using Windows.UI; namespace BetterLyrics.WinUI3.Renderer { - public class FluidBackgroundRenderer : IDisposable + public partial class FluidBackgroundRenderer : IDisposable { private PixelShaderEffect? _fluidEffect; private float _timeAccumulator = 0f; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/FogRenderer.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/FogRenderer.cs index 1c9df80..f0a9a96 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/FogRenderer.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/FogRenderer.cs @@ -6,7 +6,7 @@ using System; namespace BetterLyrics.WinUI3.Renderer { - public class FogRenderer : IDisposable + public partial class FogRenderer : IDisposable { private PixelShaderEffect? _fogEffect; private float _timeAccumulator = 0f; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/SnowRenderer.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/SnowRenderer.cs index d094957..2fdea64 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/SnowRenderer.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/SnowRenderer.cs @@ -6,7 +6,7 @@ using System; namespace BetterLyrics.WinUI3.Renderer { - public class SnowRenderer : IDisposable + public partial class SnowRenderer : IDisposable { private PixelShaderEffect? _snowEffect; private float _timeAccumulator = 0f; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/SpectrumRenderer.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/SpectrumRenderer.cs index 56c2844..940797b 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/SpectrumRenderer.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Renderer/SpectrumRenderer.cs @@ -11,7 +11,7 @@ using Windows.UI; namespace BetterLyrics.WinUI3.Renderer { - public class SpectrumRenderer : IDisposable + public partial class SpectrumRenderer : IDisposable { private CanvasGeometry? _spectrumGeometry; @@ -22,6 +22,7 @@ namespace BetterLyrics.WinUI3.Renderer int barCount, bool isEnabled, SpectrumPlacement placement, + SpectrumStyle style, double canvasWidth, double canvasHeight, Color fillColor @@ -32,7 +33,7 @@ namespace BetterLyrics.WinUI3.Renderer if (!isEnabled || spectrumData == null || spectrumData.Length == 0) return; - _spectrumGeometry = CreateGeometry(resourceCreator, spectrumData, barCount, placement, canvasWidth, canvasHeight); + _spectrumGeometry = CreateGeometry(resourceCreator, spectrumData, barCount, placement, style, canvasWidth, canvasHeight); if (_spectrumGeometry != null) { @@ -45,69 +46,115 @@ namespace BetterLyrics.WinUI3.Renderer float[] data, int barCount, SpectrumPlacement placement, + SpectrumStyle style, double width, double height) { if (barCount < 2) return null; - var points = new Vector2[barCount]; - float pointSpacing = (float)width / (barCount - 1); + float maxDataVal = 0; - for (int i = 0; i < barCount; i++) + int checkCount = Math.Min(barCount, data.Length); + for (int i = 0; i < checkCount; i++) { - float val = i < data.Length ? data[i] : 0; - points[i] = new Vector2(i * pointSpacing, val); + if (data[i] > maxDataVal) maxDataVal = data[i]; } - // 限制高度 - float maxY = 0; - foreach (var p in points) if (p.Y > maxY) maxY = p.Y; + float limitY = (float)height * 0.2f; // 高度限制为总高度的 20% + float scaleRatio = 1.0f; - float limitY = (float)height * 0.2f; - if (maxY > limitY) + if (maxDataVal > limitY) { - float ratio = limitY / maxY; - for (int i = 0; i < points.Length; i++) points[i].Y *= ratio; - } - - // 翻转 Y 轴 - if (placement == SpectrumPlacement.Bottom) - { - for (int i = 0; i < points.Length; i++) - { - points[i].Y = (float)height - points[i].Y; - } + scaleRatio = limitY / maxDataVal; } using var pathBuilder = new CanvasPathBuilder(creator); - pathBuilder.BeginFigure(points[0]); - for (int i = 0; i < barCount - 1; i++) + if (style == SpectrumStyle.Bar) { - Vector2 p0 = points[Math.Max(i - 1, 0)]; - Vector2 p1 = points[i]; - Vector2 p2 = points[i + 1]; - Vector2 p3 = points[Math.Min(i + 2, barCount - 1)]; + float totalStep = (float)width / barCount; + float gap = 2.0f; + float barWidth = totalStep - gap; + if (barWidth < 1.0f) { barWidth = totalStep; gap = 0f; } - Vector2 cp1 = p1 + (p2 - p0) / 6.0f; - Vector2 cp2 = p2 - (p3 - p1) / 6.0f; + for (int i = 0; i < barCount; i++) + { + float rawVal = i < data.Length ? data[i] : 0; + float barHeight = rawVal * scaleRatio; + if (barHeight < 0.5f) continue; - pathBuilder.AddCubicBezier(cp1, cp2, p2); - } + float x = i * totalStep; + float topY, bottomY; - // 封口 - if (placement == SpectrumPlacement.Top) - { - pathBuilder.AddLine(new Vector2(points[barCount - 1].X, 0)); - pathBuilder.AddLine(new Vector2(points[0].X, 0)); + if (placement == SpectrumPlacement.Top) + { + topY = 0; + bottomY = barHeight; + } + else // Bottom + { + topY = (float)height - barHeight; + bottomY = (float)height; + } + + // 绘制独立矩形 + pathBuilder.BeginFigure(new Vector2(x, topY)); + pathBuilder.AddLine(new Vector2(x + barWidth, topY)); + pathBuilder.AddLine(new Vector2(x + barWidth, bottomY)); + pathBuilder.AddLine(new Vector2(x, bottomY)); + pathBuilder.EndFigure(CanvasFigureLoop.Closed); + } } else { - pathBuilder.AddLine(new Vector2(points[barCount - 1].X, (float)height)); - pathBuilder.AddLine(new Vector2(points[0].X, (float)height)); + var points = new Vector2[barCount]; + float pointSpacing = (float)width / (barCount - 1); + + for (int i = 0; i < barCount; i++) + { + float rawVal = i < data.Length ? data[i] : 0; + float y = rawVal * scaleRatio; + + // 处理翻转 + if (placement == SpectrumPlacement.Bottom) + { + y = (float)height - y; + } + + points[i] = new Vector2(i * pointSpacing, y); + } + + // 绘制曲线 + pathBuilder.BeginFigure(points[0]); + + for (int i = 0; i < barCount - 1; i++) + { + Vector2 p0 = points[Math.Max(i - 1, 0)]; + Vector2 p1 = points[i]; + Vector2 p2 = points[i + 1]; + Vector2 p3 = points[Math.Min(i + 2, barCount - 1)]; + + Vector2 cp1 = p1 + (p2 - p0) / 6.0f; + Vector2 cp2 = p2 - (p3 - p1) / 6.0f; + + pathBuilder.AddCubicBezier(cp1, cp2, p2); + } + + // 封口 + if (placement == SpectrumPlacement.Top) + { + pathBuilder.AddLine(new Vector2(points[barCount - 1].X, 0)); + pathBuilder.AddLine(new Vector2(points[0].X, 0)); + } + else + { + pathBuilder.AddLine(new Vector2(points[barCount - 1].X, (float)height)); + pathBuilder.AddLine(new Vector2(points[0].X, (float)height)); + } + + pathBuilder.EndFigure(CanvasFigureLoop.Closed); } - pathBuilder.EndFigure(CanvasFigureLoop.Closed); return CanvasGeometry.CreatePath(pathBuilder); } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw index 2115721..e87e933 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw @@ -1414,12 +1414,21 @@ If you encounter any problems, please go to the Settings page, About tab, and vi Spectrum placement + + Spectrum style + Bottom Top + + Bar + + + Curve + Motion rate diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw index 6ce1d88..f452a80 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw @@ -952,6 +952,9 @@ 垂直方向 + + + 左ギャップエリア幅係数 @@ -1066,6 +1069,9 @@ オリジナルのハイライト範囲 + + + ライト @@ -1306,6 +1312,9 @@ 変更を適用するためのアプリを再起動します + + + 右ギャップエリア幅係数 @@ -1393,12 +1402,6 @@ 曲情報 - - - - - - 現在の曲です @@ -1555,7 +1558,4 @@ 利用案内 - - - \ No newline at end of file diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw index d9f71bd..9207bd2 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw @@ -952,6 +952,9 @@ 세로 + + 왼쪽 + 왼쪽 갭 영역 너비 계수 @@ -1066,6 +1069,9 @@ 원래 하이라이트 범위 + + 왼쪽 + @@ -1306,6 +1312,9 @@ 변경 사항을 적용하려면 앱을 다시 시작하십시오 + + 오른쪽 + 오른쪽 간격 영역 너비 계수 @@ -1393,12 +1402,6 @@ 노래 정보 - - 왼쪽 - - - 오른쪽 - 현재 노래 @@ -1555,7 +1558,4 @@ 사용 안내서 - - 왼쪽 - \ No newline at end of file diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw index c5c38f7..10af852 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw @@ -952,6 +952,9 @@ 垂直 + + 靠左 + 左间隙区域宽度因子 @@ -1066,6 +1069,9 @@ 原文高亮显示范围 + + 靠左 + 细体 @@ -1306,6 +1312,9 @@ 重启应用以应用更改 + + 靠右 + 右间隙区域宽度因子 @@ -1393,12 +1402,6 @@ 歌曲信息 - - 靠左 - - - 靠右 - 当前歌曲 @@ -1555,7 +1558,4 @@ 使用指南 - - 靠左 - \ No newline at end of file diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw index 41918da..1745937 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw @@ -952,6 +952,9 @@ 縱向 + + 靠左 + 左間隙區域寬度因子 @@ -1066,6 +1069,9 @@ 原文高亮顯示範圍 + + 靠左 + 細體 @@ -1306,6 +1312,9 @@ 重啟應用程式以應用更改 + + 靠右 + 右間隙區域寬度因子 @@ -1393,12 +1402,6 @@ 歌曲資訊 - - 靠左 - - - 靠右 - 當前歌曲 @@ -1555,7 +1558,4 @@ 使用手冊 - - 靠左 - \ No newline at end of file diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml index 734628a..17aca9c 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml @@ -75,7 +75,10 @@ - + diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml.cs index 677384d..a18fe2b 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsPage.xaml.cs @@ -778,5 +778,9 @@ namespace BetterLyrics.WinUI3.Views } } + private void ShadowCastGrid_SizeChanged(object sender, SizeChangedEventArgs e) + { + UpdateAlbumArtCornerRadius(); + } } }