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();
+ }
}
}