Xamarin.Forms Slider.Clicked事件?
我正在用Xamarin.Forms制作一个mp3播放器,在这个播放器中,滑块应该显示过期的时间,并允许跳转到曲目中的位置。 据我所知,只有ValueChanged事件可用,不幸的是,每次计时器更新滑块值时,我也会触发player.SeekTo方法,导致播放中断 有没有办法专门在滑块上拾取触摸事件? 如果没有,是否有人对如何使这项工作有任何建议 如果相关,以下是我的主页代码:Xamarin.Forms Slider.Clicked事件?,xamarin.forms,Xamarin.forms,我正在用Xamarin.Forms制作一个mp3播放器,在这个播放器中,滑块应该显示过期的时间,并允许跳转到曲目中的位置。 据我所知,只有ValueChanged事件可用,不幸的是,每次计时器更新滑块值时,我也会触发player.SeekTo方法,导致播放中断 有没有办法专门在滑块上拾取触摸事件? 如果没有,是否有人对如何使这项工作有任何建议 如果相关,以下是我的主页代码: using System; using System.Collections.Generic; using System.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace MuZor
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
PlayButton.Clicked += PlayButton_Clicked;
PlaylistsButton.Clicked += PlaylistsButton_Clicked;
RandomButton.Clicked += RandomButton_Clicked;
RepeatButton.Clicked += RepeatButton_Clicked;
ChoiceButton.Clicked += ChoiceButton_Clicked;
PreviousButton.Clicked += PreviousButton_Clicked;
NextButton.Clicked += NextButton_Clicked;
TimeSlider.ValueChanged += TimeSlider_ValueChanged;
MessagingCenter.Subscribe<Interfaces.IAudioPlayer>(App.player, "PlayerPrepared", (args) =>
{
System.Diagnostics.Debug.WriteLine("Message received");
PlayerPrepared();
});
}
private void TimeSlider_ValueChanged(object sender, ValueChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("Slider value changed, value = " + e.NewValue + "(int = " + (int)e.NewValue);
//App.player.SeekTo((int)e.NewValue);
}
private void NextButton_Clicked(object sender, EventArgs e)
{
if (!App.settings.RandomOn && App.settings.CurrentTrack < App.playlist.Count - 1)
{
Play((int)App.settings.CurrentTrack + 1);
}
}
private void PreviousButton_Clicked(object sender, EventArgs e)
{
if (!App.settings.RandomOn && App.settings.CurrentTrack > 0)
{
Play((int)App.settings.CurrentTrack - 1);
}
}
private void ChoiceButton_Clicked(object sender, EventArgs e)
{
}
private void RepeatButton_Clicked(object sender, EventArgs e)
{
}
private void RandomButton_Clicked(object sender, EventArgs e)
{
}
private void PlaylistsButton_Clicked(object sender, EventArgs e)
{
}
private void PlayButton_Clicked(object sender, EventArgs e)
{
if (App.settings.IsPaused || App.player.IsPlaying())
{
App.player.PauseResume();
if (App.settings.IsPaused)
{
UnPause();
}
else
{
Pause();
}
}
else
{
int trackToplay = App.settings.CurrentTrack != null ? (int)App.settings.CurrentTrack : 0;
Play(trackToplay);
}
}
private void Play(int currentTrack)
{
HelperClasses.SettingsHelper.SaveCurrentTrack(currentTrack);
App.player.LoadAndPlay(App.playlist[currentTrack].Path);
}
private void Pause()
{
HelperClasses.SettingsHelper.SavePausedState(true);
Device.BeginInvokeOnMainThread(() =>
{
PlayButton.Text = "Play";
});
}
private void UnPause()
{
HelperClasses.SettingsHelper.SavePausedState(false);
Device.BeginInvokeOnMainThread(() =>
{
PlayButton.Text = "Pause";
});
StartTimer();
}
private void StartTimer()
{
double position;
Device.StartTimer(new TimeSpan(0, 0, 1), () =>
{
position = App.player.GetCurrentPosition();
TimeSpan runTime = TimeSpan.FromMilliseconds(position);
Device.BeginInvokeOnMainThread(() =>
{
TimeLabel.Text = runTime.ToString(@"mm\:ss");
TimeSlider.Value = position;
});
if (App.player.IsPlaying())
return true;
else
return false;
});
}
private void PlayerPrepared()
{
var totalDurationInMS = App.player.GetDuration();
TimeSlider.Maximum = totalDurationInMS;
TimeSlider.Minimum = 0;
TimeSpan totalDuration = TimeSpan.FromMilliseconds(totalDurationInMS);
Device.BeginInvokeOnMainThread(() =>
{
RemainingTimeLabel.Text = totalDuration.ToString(@"mm\:ss");
TimeLabel.Text = "00:00";
});
UnPause();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Xamarin.Forms;
名称空间MuZor
{
公共部分类主页:ContentPage
{
公共主页()
{
初始化组件();
PlayButton.Clicked+=PlayButton\u Clicked;
playlisbutton.Clicked+=playlisbutton_Clicked;
RandomButton.Clicked+=RandomButton\u Clicked;
RepeatButton.Clicked+=RepeatButton\u Clicked;
ChoiceButton.Clicked+=ChoiceButton\u Clicked;
PreviousButton.Clicked+=PreviousButton\u Clicked;
NextButton.Clicked+=NextButton\u Clicked;
TimeSlider.ValueChanged+=TimeSlider\u ValueChanged;
MessagingCenter.Subscribe(App.player,“PlayerPrepared”,(args)=>
{
System.Diagnostics.Debug.WriteLine(“收到消息”);
PlayerPrepared();
});
}
private void TimeSlider_ValueChanged(对象发送方,ValueChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine(“滑块值已更改,value=“+e.NewValue+”(int=“+(int)e.NewValue));
//App.player.SeekTo((int)e.NewValue);
}
已单击private void NextButton(对象发送者,事件参数e)
{
如果(!App.settings.RandomOn&&App.settings.CurrentTrack0)
{
播放((int)App.settings.CurrentTrack-1);
}
}
已单击私有无效选项按钮(对象发送者,事件参数e)
{
}
已单击私有无效重复按钮(对象发送者,事件参数e)
{
}
已单击私有无效随机按钮(对象发送者,事件参数e)
{
}
已单击私有无效播放列表按钮(对象发送者,事件参数e)
{
}
已单击私有void播放按钮(对象发送者,事件参数e)
{
如果(App.settings.IsPaused | | App.player.isplay())
{
App.player.PauseResume();
如果(App.settings.IsPaused)
{
取消暂停();
}
其他的
{
暂停();
}
}
其他的
{
int trackToplay=App.settings.CurrentTrack!=null?(int)App.settings.CurrentTrack:0;
播放(trackToplay);
}
}
私人无效播放(int currentTrack)
{
HelperClass.SettingsHelper.SaveCurrentTrack(currentTrack);
App.player.LoadAndPlay(App.playlist[currentTrack].Path);
}
私有无效暂停()
{
HelperClasses.SettingsHelper.SavePausedState(true);
Device.beginInvokeMainThread(()=>
{
PlayButton.Text=“播放”;
});
}
私有无效取消暂停()
{
HelperClasses.SettingsHelper.SavePausedState(false);
Device.beginInvokeMainThread(()=>
{
PlayButton.Text=“暂停”;
});
StartTimer();
}
私有void StartTimer()
{
双位;
Device.StartTimer(新的时间跨度(0,0,1),()=>
{
position=App.player.GetCurrentPosition();
TimeSpan运行时=TimeSpan.From毫秒(位置);
Device.beginInvokeMainThread(()=>
{
TimeLabel.Text=runTime.ToString(@“mm \:ss”);
时间滑块。值=位置;
});
if(App.player.IsPlaying())
返回true;
其他的
返回false;
});
}
私有void PlayerPrepared()
{
var totalDurationInMS=App.player.GetDuration();
时间滑块最大值=总持续时间Nms;
时间滑块。最小值=0;
TimeSpan totalDuration=TimeSpan.From毫秒(TotalDurationNms);
Device.beginInvokeMainThread(()=>
{
RemainingTimeLabel.Text=totalDuration.ToString(@“mm\:ss”);
TimeLabel.Text=“00:00”;
});
取消暂停();
}
}
}
我想我已经找到了一个解决方法。由于valuechanged事件同时包含旧值和新值,因此只有当差值为负值或大于2时,我才会触发SeekTo