详情

祗疼妳一个 Lv.8

关注
WPF 按钮点击音效实现

下面我将为您提供一个完备的 WPF 按钮点击音效实现方案,包罗多种实现方式和高级功能
完备实现方案

MainWindow.xaml
  1. <Window x:Class="ButtonClickSound.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.         xmlns:local="clr-namespace:ButtonClickSound"
  7.         mc:Ignorable="d"
  8.         Title="按钮点击音效演示"
  9.         Height="450"
  10.         Width="800"
  11.         WindowStartupLocation="CenterScreen"
  12.         Background="#FF1E1E1E">
  13.    
  14.     <Window.Resources>
  15.         <!-- 音效资源 -->
  16.         <MediaPlayer x:Key="ClickSoundPlayer" Source="sounds/click.wav" Volume="0.7"/>
  17.         <MediaPlayer x:Key="HoverSoundPlayer" Source="sounds/hover.wav" Volume="0.5"/>
  18.         
  19.         <!-- 按钮样式 -->
  20.         <Style x:Key="SoundButtonStyle" TargetType="Button">
  21.             <Setter Property="Background" Value="#FF252526"/>
  22.             <Setter Property="Foreground" Value="White"/>
  23.             <Setter Property="BorderBrush" Value="#FF3F3F46"/>
  24.             <Setter Property="BorderThickness" Value="1"/>
  25.             <Setter Property="FontSize" Value="18"/>
  26.             <Setter Property="Padding" Value="20,10"/>
  27.             <Setter Property="Margin" Value="10"/>
  28.             <Setter Property="Cursor" Value="Hand"/>
  29.             <Setter Property="Template">
  30.                 <Setter.Value>
  31.                     <ControlTemplate TargetType="Button">
  32.                         <Border x:Name="border"
  33.                                 Background="{TemplateBinding Background}"
  34.                                 BorderBrush="{TemplateBinding BorderBrush}"
  35.                                 BorderThickness="{TemplateBinding BorderThickness}"
  36.                                 CornerRadius="8">
  37.                             <ContentPresenter HorizontalAlignment="Center"
  38.                                               VerticalAlignment="Center"
  39.                                               Margin="{TemplateBinding Padding}"/>
  40.                         </Border>
  41.                         <ControlTemplate.Triggers>
  42.                             <Trigger Property="IsMouseOver" Value="True">
  43.                                 <Setter Property="Background" Value="#FF3A80D2"/>
  44.                                 <Setter Property="BorderBrush" Value="#FF2A70C2"/>
  45.                             </Trigger>
  46.                             <Trigger Property="IsPressed" Value="True">
  47.                                 <Setter Property="Background" Value="#FF2A70C2"/>
  48.                                 <Setter Property="BorderBrush" Value="#FF1A60B2"/>
  49.                             </Trigger>
  50.                         </ControlTemplate.Triggers>
  51.                     </ControlTemplate>
  52.                 </Setter.Value>
  53.             </Setter>
  54.         </Style>
  55.     </Window.Resources>
  56.    
  57.     <Grid>
  58.         <Grid.RowDefinitions>
  59.             <RowDefinition Height="Auto"/>
  60.             <RowDefinition Height="*"/>
  61.             <RowDefinition Height="Auto"/>
  62.         </Grid.RowDefinitions>
  63.         
  64.         <!-- 标题 -->
  65.         <TextBlock Text="按钮点击音效演示"
  66.                    Grid.Row="0"
  67.                    FontSize="28"
  68.                    FontWeight="Bold"
  69.                    Foreground="White"
  70.                    HorizontalAlignment="Center"
  71.                    Margin="0,20"/>
  72.         
  73.         <!-- 按钮区域 -->
  74.         <Grid Grid.Row="1">
  75.             <Grid.ColumnDefinitions>
  76.                 <ColumnDefinition Width="*"/>
  77.                 <ColumnDefinition Width="*"/>
  78.             </Grid.ColumnDefinitions>
  79.             
  80.             <!-- 简单实现 -->
  81.             <StackPanel Grid.Column="0"
  82.                         VerticalAlignment="Center"
  83.                         HorizontalAlignment="Center">
  84.                 <TextBlock Text="简单实现"
  85.                            FontSize="20"
  86.                            Foreground="#AAAAAA"
  87.                            HorizontalAlignment="Center"
  88.                            Margin="0,0,0,20"/>
  89.                
  90.                 <!-- 直接绑定事件 -->
  91.                 <Button Content="事件处理器"
  92.                         Style="{StaticResource SoundButtonStyle}"
  93.                         Click="ButtonWithEventHandler_Click"/>
  94.                
  95.                 <!-- 使用行为 -->
  96.                 <Button Content="使用行为"
  97.                         Style="{StaticResource SoundButtonStyle}"
  98.                         local:SoundBehavior.ClickSound="{StaticResource ClickSoundPlayer}"/>
  99.                
  100.                 <!-- 使用命令 -->
  101.                 <Button Content="使用命令"
  102.                         Style="{StaticResource SoundButtonStyle}"
  103.                         Command="{Binding PlaySoundCommand}"/>
  104.             </StackPanel>
  105.             
  106.             <!-- 高级实现 -->
  107.             <StackPanel Grid.Column="1"
  108.                         VerticalAlignment="Center"
  109.                         HorizontalAlignment="Center">
  110.                 <TextBlock Text="高级实现"
  111.                            FontSize="20"
  112.                            Foreground="#AAAAAA"
  113.                            HorizontalAlignment="Center"
  114.                            Margin="0,0,0,20"/>
  115.                
  116.                 <!-- 悬停+点击音效 -->
  117.                 <Button Content="悬停+点击音效"
  118.                         Style="{StaticResource SoundButtonStyle}"
  119.                         local:SoundBehavior.HoverSound="{StaticResource HoverSoundPlayer}"
  120.                         local:SoundBehavior.ClickSound="{StaticResource ClickSoundPlayer}"/>
  121.                
  122.                 <!-- 自定义音效 -->
  123.                 <Button Content="自定义音效"
  124.                         Style="{StaticResource SoundButtonStyle}"
  125.                         local:SoundBehavior.ClickSound="{StaticResource ClickSoundPlayer}"
  126.                         Click="CustomSoundButton_Click"/>
  127.                
  128.                 <!-- 随机音效 -->
  129.                 <Button Content="随机音效"
  130.                         Style="{StaticResource SoundButtonStyle}"
  131.                         Click="RandomSoundButton_Click"/>
  132.             </StackPanel>
  133.         </Grid>
  134.         
  135.         <!-- 控制面板 -->
  136.         <Border Grid.Row="2"
  137.                 Background="#202020"
  138.                 CornerRadius="10"
  139.                 Padding="20"
  140.                 Margin="20"
  141.                 HorizontalAlignment="Center">
  142.             <StackPanel Orientation="Horizontal" Spacing="20">
  143.                 <Button Content="播放点击音效"
  144.                         Style="{StaticResource SoundButtonStyle}"
  145.                         Click="PlaySound_Click"/>
  146.                 <Button Content="停止所有音效"
  147.                         Style="{StaticResource SoundButtonStyle}"
  148.                         Click="StopAllSounds_Click"/>
  149.                 <Button Content="切换静音模式"
  150.                         Style="{StaticResource SoundButtonStyle}"
  151.                         Click="ToggleMute_Click"/>
  152.             </StackPanel>
  153.         </Border>
  154.     </Grid>
  155. </Window>
SoundBehavior.cs (音效行为类)
  1. using System.Windows;
  2. using System.Windows.Controls;
  3. using System.Windows.Input;
  4. using System.Windows.Media;
  5. namespace ButtonClickSound
  6. {
  7.     public static class SoundBehavior
  8.     {
  9.         #region ClickSound 附加属性
  10.         public static MediaPlayer GetClickSound(DependencyObject obj)
  11.         {
  12.             return (MediaPlayer)obj.GetValue(ClickSoundProperty);
  13.         }
  14.         public static void SetClickSound(DependencyObject obj, MediaPlayer value)
  15.         {
  16.             obj.SetValue(ClickSoundProperty, value);
  17.         }
  18.         public static readonly DependencyProperty ClickSoundProperty =
  19.             DependencyProperty.RegisterAttached("ClickSound", typeof(MediaPlayer), typeof(SoundBehavior),
  20.                 new PropertyMetadata(null, OnClickSoundChanged));
  21.         private static void OnClickSoundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  22.         {
  23.             if (d is Button button)
  24.             {
  25.                 button.Click -= Button_Click;
  26.                
  27.                 if (e.NewValue != null)
  28.                 {
  29.                     button.Click += Button_Click;
  30.                 }
  31.             }
  32.         }
  33.         private static void Button_Click(object sender, RoutedEventArgs e)
  34.         {
  35.             if (sender is Button button)
  36.             {
  37.                 var player = GetClickSound(button);
  38.                 if (player != null)
  39.                 {
  40.                     player.Position = TimeSpan.Zero;
  41.                     player.Play();
  42.                 }
  43.             }
  44.         }
  45.         #endregion
  46.         #region HoverSound 附加属性
  47.         public static MediaPlayer GetHoverSound(DependencyObject obj)
  48.         {
  49.             return (MediaPlayer)obj.GetValue(HoverSoundProperty);
  50.         }
  51.         public static void SetHoverSound(DependencyObject obj, MediaPlayer value)
  52.         {
  53.             obj.SetValue(HoverSoundProperty, value);
  54.         }
  55.         public static readonly DependencyProperty HoverSoundProperty =
  56.             DependencyProperty.RegisterAttached("HoverSound", typeof(MediaPlayer), typeof(SoundBehavior),
  57.                 new PropertyMetadata(null, OnHoverSoundChanged));
  58.         private static void OnHoverSoundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  59.         {
  60.             if (d is Button button)
  61.             {
  62.                 button.MouseEnter -= Button_MouseEnter;
  63.                
  64.                 if (e.NewValue != null)
  65.                 {
  66.                     button.MouseEnter += Button_MouseEnter;
  67.                 }
  68.             }
  69.         }
  70.         private static void Button_MouseEnter(object sender, MouseEventArgs e)
  71.         {
  72.             if (sender is Button button)
  73.             {
  74.                 var player = GetHoverSound(button);
  75.                 if (player != null)
  76.                 {
  77.                     player.Position = TimeSpan.Zero;
  78.                     player.Play();
  79.                 }
  80.             }
  81.         }
  82.         #endregion
  83.     }
  84. }
MainWindow.xaml.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Input;
  6. using System.Windows.Media;
  7. namespace ButtonClickSound
  8. {
  9.     public partial class MainWindow : Window
  10.     {
  11.         // 全局音效播放器
  12.         private MediaPlayer _globalClickPlayer = new MediaPlayer();
  13.         
  14.         // 随机音效列表
  15.         private List<MediaPlayer> _randomSounds = new List<MediaPlayer>();
  16.         private Random _random = new Random();
  17.         
  18.         // 静音状态
  19.         private bool _isMuted = false;
  20.         public ICommand PlaySoundCommand { get; }
  21.         public MainWindow()
  22.         {
  23.             InitializeComponent();
  24.             LoadSounds();
  25.             
  26.             // 初始化命令
  27.             PlaySoundCommand = new RelayCommand(ExecutePlaySound);
  28.             
  29.             DataContext = this;
  30.         }
  31.         private void LoadSounds()
  32.         {
  33.             try
  34.             {
  35.                 // 初始化全局点击音效
  36.                 _globalClickPlayer.Open(new Uri("sounds/click.wav", UriKind.Relative));
  37.                 _globalClickPlayer.Volume = 0.7;
  38.                
  39.                 // 初始化随机音效
  40.                 _randomSounds.Add(CreateSoundPlayer("sounds/click1.wav", 0.7));
  41.                 _randomSounds.Add(CreateSoundPlayer("sounds/click2.wav", 0.6));
  42.                 _randomSounds.Add(CreateSoundPlayer("sounds/click3.wav", 0.8));
  43.                 _randomSounds.Add(CreateSoundPlayer("sounds/click4.wav", 0.5));
  44.             }
  45.             catch (Exception ex)
  46.             {
  47.                 MessageBox.Show($"加载音效失败: {ex.Message}", "错误",
  48.                                 MessageBoxButton.OK, MessageBoxImage.Error);
  49.             }
  50.         }
  51.         private MediaPlayer CreateSoundPlayer(string path, double volume)
  52.         {
  53.             var player = new MediaPlayer();
  54.             player.Open(new Uri(path, UriKind.Relative));
  55.             player.Volume = volume;
  56.             return player;
  57.         }
  58.         #region 简单实现方法
  59.         
  60.         // 方法1: 直接在事件处理器中播放音效
  61.         private void ButtonWithEventHandler_Click(object sender, RoutedEventArgs e)
  62.         {
  63.             PlayGlobalClickSound();
  64.         }
  65.         
  66.         // 方法2: 使用命令播放音效
  67.         private void ExecutePlaySound()
  68.         {
  69.             PlayGlobalClickSound();
  70.         }
  71.         
  72.         #endregion
  73.         #region 高级实现方法
  74.         
  75.         // 自定义音效按钮
  76.         private void CustomSoundButton_Click(object sender, RoutedEventArgs e)
  77.         {
  78.             // 创建临时音效播放器
  79.             var player = new MediaPlayer();
  80.             player.Open(new Uri("sounds/special_click.wav", UriKind.Relative));
  81.             player.Volume = 0.8;
  82.             player.Play();
  83.             
  84.             // 播放完成后自动释放资源
  85.             player.MediaEnded += (s, args) => player.Close();
  86.         }
  87.         
  88.         // 随机音效按钮
  89.         private void RandomSoundButton_Click(object sender, RoutedEventArgs e)
  90.         {
  91.             if (_randomSounds.Count == 0) return;
  92.             
  93.             int index = _random.Next(0, _randomSounds.Count);
  94.             var player = _randomSounds[index];
  95.             
  96.             player.Position = TimeSpan.Zero;
  97.             player.Play();
  98.         }
  99.         
  100.         #endregion
  101.         #region 控制面板方法
  102.         
  103.         private void PlaySound_Click(object sender, RoutedEventArgs e)
  104.         {
  105.             PlayGlobalClickSound();
  106.         }
  107.         
  108.         private void StopAllSounds_Click(object sender, RoutedEventArgs e)
  109.         {
  110.             _globalClickPlayer.Stop();
  111.             
  112.             foreach (var player in _randomSounds)
  113.             {
  114.                 player.Stop();
  115.             }
  116.         }
  117.         
  118.         private void ToggleMute_Click(object sender, RoutedEventArgs e)
  119.         {
  120.             _isMuted = !_isMuted;
  121.             
  122.             // 设置全局音量
  123.             double volume = _isMuted ? 0.0 : 0.7;
  124.             _globalClickPlayer.Volume = volume;
  125.             
  126.             foreach (var player in _randomSounds)
  127.             {
  128.                 player.Volume = volume;
  129.             }
  130.             
  131.             // 更新按钮文本
  132.             ((Button)sender).Content = _isMuted ? "取消静音" : "切换静音模式";
  133.         }
  134.         
  135.         #endregion
  136.         private void PlayGlobalClickSound()
  137.         {
  138.             _globalClickPlayer.Position = TimeSpan.Zero;
  139.             _globalClickPlayer.Play();
  140.         }
  141.     }
  142.    
  143.     // 命令实现
  144.     public class RelayCommand : ICommand
  145.     {
  146.         private readonly Action _execute;
  147.         private readonly Func<bool> _canExecute;
  148.         public event EventHandler CanExecuteChanged
  149.         {
  150.             add { CommandManager.RequerySuggested += value; }
  151.             remove { CommandManager.RequerySuggested -= value; }
  152.         }
  153.         public RelayCommand(Action execute, Func<bool> canExecute = null)
  154.         {
  155.             _execute = execute ?? throw new ArgumentNullException(nameof(execute));
  156.             _canExecute = canExecute;
  157.         }
  158.         public bool CanExecute(object parameter) => _canExecute?.Invoke() ?? true;
  159.         public void Execute(object parameter) => _execute();
  160.     }
  161. }
实现方法详解

1. 简朴实现方法

方法1: 直接在变乱处置惩罚器中播放音效
  1. private void ButtonWithEventHandler_Click(object sender, RoutedEventArgs e)
  2. {
  3.     // 创建或使用全局播放器
  4.     var player = new MediaPlayer();
  5.     player.Open(new Uri("sounds/click.wav", UriKind.Relative));
  6.     player.Play();
  7.    
  8.     // 或者使用全局播放器
  9.     _globalClickPlayer.Position = TimeSpan.Zero;
  10.     _globalClickPlayer.Play();
  11. }
方法2: 利用附加行为
  1. <Button Content="使用行为"
  2.         local:SoundBehavior.ClickSound="{StaticResource ClickSoundPlayer}"/>
2. 高级实现方法

悬停+点击音效组合
  1. <Button Content="悬停+点击音效"
  2.         local:SoundBehavior.HoverSound="{StaticResource HoverSoundPlayer}"
  3.         local:SoundBehavior.ClickSound="{StaticResource ClickSoundPlayer}"/>
自界说音效
  1. private void CustomSoundButton_Click(object sender, RoutedEventArgs e)
  2. {
  3.     // 创建临时音效播放器
  4.     var player = new MediaPlayer();
  5.     player.Open(new Uri("sounds/special_click.wav", UriKind.Relative));
  6.     player.Play();
  7.    
  8.     // 播放完成后自动释放资源
  9.     player.MediaEnded += (s, args) => player.Close();
  10. }
随机音效
  1. private void RandomSoundButton_Click(object sender, RoutedEventArgs e)
  2. {
  3.     if (_randomSounds.Count == 0) return;
  4.    
  5.     int index = _random.Next(0, _randomSounds.Count);
  6.     var player = _randomSounds[index];
  7.    
  8.     player.Position = TimeSpan.Zero;
  9.     player.Play();
  10. }
3. 利用下令实现
  1. public ICommand PlaySoundCommand { get; }
  2. public MainWindow()
  3. {
  4.     PlaySoundCommand = new RelayCommand(ExecutePlaySound);
  5. }
  6. private void ExecutePlaySound()
  7. {
  8.     PlayGlobalClickSound();
  9. }
  10. // XAML
  11. <Button Content="使用命令" Command="{Binding PlaySoundCommand}"/>
高级功能实现

1. 音效管理
  1. // 全局音效管理器
  2. public static class SoundManager
  3. {
  4.     private static readonly Dictionary<string, MediaPlayer> _sounds = new Dictionary<string, MediaPlayer>();
  5.     private static double _globalVolume = 0.7;
  6.     private static bool _isMuted = false;
  7.     public static void LoadSound(string name, string path, double volume = 1.0)
  8.     {
  9.         if (_sounds.ContainsKey(name)) return;
  10.         
  11.         var player = new MediaPlayer();
  12.         player.Open(new Uri(path, UriKind.Relative));
  13.         player.Volume = volume * _globalVolume;
  14.         _sounds[name] = player;
  15.     }
  16.     public static void PlaySound(string name)
  17.     {
  18.         if (_isMuted || !_sounds.TryGetValue(name, out var player)) return;
  19.         
  20.         player.Position = TimeSpan.Zero;
  21.         player.Play();
  22.     }
  23.     public static void SetGlobalVolume(double volume)
  24.     {
  25.         _globalVolume = volume;
  26.         foreach (var player in _sounds.Values)
  27.         {
  28.             player.Volume = volume;
  29.         }
  30.     }
  31.     public static void SetMute(bool isMuted)
  32.     {
  33.         _isMuted = isMuted;
  34.     }
  35. }
  36. // 使用
  37. SoundManager.LoadSound("click", "sounds/click.wav", 0.7);
  38. SoundManager.PlaySound("click");
2. 3D音效结果
  1. private void PlayPositionalSound(Point position)
  2. {
  3.     // 计算相对于窗口中心的位置
  4.     double centerX = ActualWidth / 2;
  5.     double centerY = ActualHeight / 2;
  6.    
  7.     // 计算相对位置 (-1 到 1)
  8.     double relX = (position.X - centerX) / centerX;
  9.     double relY = (position.Y - centerY) / centerY;
  10.    
  11.     // 创建音效播放器
  12.     var player = new MediaPlayer();
  13.     player.Open(new Uri("sounds/click.wav", UriKind.Relative));
  14.    
  15.     // 应用平衡效果 (左右声道)
  16.     player.Balance = Math.Clamp(relX, -1.0, 1.0);
  17.    
  18.     // 应用音量衰减
  19.     double distance = Math.Sqrt(relX * relX + relY * relY);
  20.     player.Volume = Math.Clamp(1.0 - distance * 0.5, 0.2, 1.0);
  21.    
  22.     player.Play();
  23. }
3. 音效池系统
  1. public class SoundPool
  2. {
  3.     private readonly List<MediaPlayer> _players = new List<MediaPlayer>();
  4.     private readonly string _soundPath;
  5.     private readonly double _volume;
  6.     private int _currentIndex = 0;
  7.     public SoundPool(string soundPath, int poolSize = 5, double volume = 1.0)
  8.     {
  9.         _soundPath = soundPath;
  10.         _volume = volume;
  11.         
  12.         // 初始化播放器池
  13.         for (int i = 0; i < poolSize; i++)
  14.         {
  15.             var player = new MediaPlayer();
  16.             player.Open(new Uri(soundPath, UriKind.Relative));
  17.             player.Volume = volume;
  18.             _players.Add(player);
  19.         }
  20.     }
  21.     public void Play()
  22.     {
  23.         // 选择下一个播放器
  24.         var player = _players[_currentIndex];
  25.         
  26.         // 重置位置
  27.         player.Position = TimeSpan.Zero;
  28.         player.Play();
  29.         
  30.         // 移动到下一个播放器
  31.         _currentIndex = (_currentIndex + 1) % _players.Count;
  32.     }
  33. }
  34. // 使用
  35. private SoundPool _clickSoundPool = new SoundPool("sounds/click.wav", 5, 0.7);
  36. private void Button_Click(object sender, RoutedEventArgs e)
  37. {
  38.     _clickSoundPool.Play();
  39. }
专业建议

1. 音效文件处置惩罚


  • 利用16位PCM WAV格式以获得最佳兼容性
  • 保持音效文件短小(通常小于500ms)
  • 利用44.1kHz采样率
  • 预加载常用音效以减少耽误
2. 性能优化
  1. // 预加载音效
  2. private void PreloadSounds()
  3. {
  4.     // 使用后台线程预加载
  5.     Task.Run(() =>
  6.     {
  7.         var player = new MediaPlayer();
  8.         player.Open(new Uri("sounds/click.wav", UriKind.Relative));
  9.         
  10.         // 预读到内存
  11.         player.Play();
  12.         player.Pause();
  13.         player.Position = TimeSpan.Zero;
  14.     });
  15. }
  16. // 使用NAudio进行低延迟播放
  17. private void PlayLowLatencySound(string path)
  18. {
  19.     using (var audioFile = new AudioFileReader(path))
  20.     using (var outputDevice = new WaveOutEvent())
  21.     {
  22.         outputDevice.Init(audioFile);
  23.         outputDevice.Play();
  24.     }
  25. }
3. 无停滞支持
  1. // 检查用户是否启用了声音
  2. private bool IsSoundEnabled()
  3. {
  4.     // 检查系统设置
  5.     bool systemSoundEnabled = SystemParameters.ClientAudioPlayback;
  6.    
  7.     // 检查用户偏好
  8.     bool userPreference = Properties.Settings.Default.SoundEnabled;
  9.    
  10.     return systemSoundEnabled && userPreference;
  11. }
  12. // 提供视觉反馈替代
  13. private void PlaySoundWithVisualFeedback()
  14. {
  15.     if (IsSoundEnabled())
  16.     {
  17.         PlayGlobalClickSound();
  18.     }
  19.     else
  20.     {
  21.         // 提供视觉反馈
  22.         var button = sender as Button;
  23.         var originalBrush = button.Background;
  24.         
  25.         button.Background = Brushes.Gray;
  26.         
  27.         // 短暂延迟后恢复
  28.         Task.Delay(100).ContinueWith(_ =>
  29.         {
  30.             Dispatcher.Invoke(() => button.Background = originalBrush);
  31.         });
  32.     }
  33. }
这个实现提供了多种按钮点击音效的实现方式,从简朴的直接变乱处置惩罚到高级的音效管理系统和3D音效结果。您可以根据项目需求选择合适的实现方法,

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
5阅读
0回复

暂无评论,点我抢沙发吧