Ich möchte Schieberegler von Xamarin.forms als Audio-Player-Leiste verwenden. Ich habe einen Abhängigkeitsdienst, um die Aufnahme abzuspielen und die Gesamtdauer und die aktuelle Position zu erhalten. Wie muss ich es auf meinen Slider setzen?Xamarin.forms Slider als Audio-Player-Leiste
Her ist mein Code:
Button btnPlay = new Button
{
Text = "Play/Pause",
Command = new Command(() =>
{
DependencyService.Get<IAudio>().PlayMp3File();
})
};
Button btnStop = new Button { Text = "Stop" };
TimeSpan timeSpan = DependencyService.Get<IAudio>().GetInfo();
Label lblDuration = new Label { Text = String.Format("{0:hh\\:mm\\:ss}", timeSpan) };
var slider = new Slider {
Minimum = 0,
Maximum = timeSpan.TotalHours,
};
var label = new Label {
Text = "Slider value is 0",
FontSize = 25,
HorizontalOptions = LayoutOptions.Start,
};
slider.ValueChanged +=
(sender, e) =>
{
label.Text = String.Format("Slider value is {0:hh\\:mm\\:ss}", TimeSpan.FromMilliseconds(e.NewValue));
DependencyService.Get<IAudio>().SeekTo(Convert.ToInt32(e.NewValue));
};
MainPage = new ContentPage
{
Content = new StackLayout {
Children = {
btnPlay,
btnStop,
slider,
lblDuration,
label
}
},
Padding = new Thickness (10, Device.OnPlatform (20, 0, 0), 10, 5)
};
ich in einem Etikett Gesamtdauer setze. Wie muss ich auf dem Änderungsschieberegler programmieren, um das Etikett auf aktuelle Position zu setzen. Und wie wird mein Schieberegler Wert basierend auf der Datei erhöht werden?
bearbeiten
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AudioTest
{
public interface IAudio
{
Task PlayMp3File();
// bool PlayWavFile(string fileName);
Task SeekTo(int msec);
TimeSpan GetInfo();
void Stop();
double CurrentPosition();
bool Isplaying();
}
}
Audioservice.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using AudioTest.Droid;
using Xamarin.Forms;
using Android.Media;
using System.Threading.Tasks;
[assembly: Dependency(typeof(AudioService))]
namespace AudioTest.Droid
{
public class AudioService : IAudio
{
public AudioService() { }
MediaPlayer player = null;
public async Task StartPlayerAsync()
{
try
{
if (player == null)
{
player = new MediaPlayer();
player = MediaPlayer.Create(global::Android.App.Application.Context, Resource.Raw.test);
player.Start();
}
else
{
if (player.IsPlaying == true)
{
player.Pause();
}
else
{
player.Start();
}
}
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.StackTrace);
}
}
public void StopPlayer()
{
if ((player != null))
{
if (player.IsPlaying)
{
player.Stop();
}
player.Release();
player = null;
}
}
public async Task PlayMp3File()
{
await StartPlayerAsync();
}
public void Stop()
{
this.StopPlayer();
}
public async Task SeekTo(int s)
{
await seekTo(s);
}
public double CurrentPosition()
{
if ((player != null))
{
return player.CurrentPosition;
}
else
{ return 0; }
}
private async Task seekTo(int mseconds)
{
if (player == null)
{
player = new MediaPlayer();
player = MediaPlayer.Create(global::Android.App.Application.Context, Resource.Raw.test);
}
player.SeekTo(mseconds);
player.Start();
}
public TimeSpan GetInfo()
{
int arr;
if (player == null)
{
player = new MediaPlayer();
player = MediaPlayer.Create(global::Android.App.Application.Context, Resource.Raw.test);
}
arr = player.Duration;
return TimeSpan.FromMilliseconds(arr);
}
public bool Isplaying()
{
if (player == null)
{
return false;
}
else {
return player.IsPlaying;
}
}
}
}
Sorry, my bad. Ich möchte, dass der Slider die Sekunde verfolgt. :-( – Arti
Ich habe meine Frage zu der hinzugefügten Schnittstelle Klassenstruktur bearbeitet – Arti
Ich kann Ereignis PositionChanged auf der Schnittstelle nicht hinzufügen, erhalten 'Fehler Erwartete Klasse, Delegieren, Aufzählung, Schnittstelle oder Struktur" – Arti