2016-05-13 10 views
0

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; 
       } 

     } 
    } 
} 

Antwort

1

Bevor ich die Frage zu beantworten, lassen Sie mich Ihnen eine meiner eigenen fragen: Wollen Sie wirklich den Slider Stunden verfolgen? Ich würde erwarten, dass ein Medienschieberegler Sekunden oder Zehntelsekunden verfolgt; Stunden ist ein sehr grober Schritt.

Unter der Annahme, dass Sie den Autor der IAudio Schnittstelle und deren Umsetzung ist, wäre meine Empfehlung für sein den IAudio Schnittstelle, ein Ereignis zu belichten und Feuer (zum Beispiel: PositionChanged), die die aktuelle Position umfasst, wenn die Abspielposition ändert. Die Implementierung der Schnittstelle IAudio würde den Rahmen dieser Frage sprengen, aber ich würde erwarten, dass Sie ein Ereignis abonnieren oder einen Rückruf mit dem von Ihnen verwendeten Medienstapel registrieren würden, der wiederum das Ereignis PositionChanged auslösen würde.

HINWEIS: Ich nehme auch an, dass Sie wirklich Sekunden meinten; Wenn du wirklich Stunden bedeutest, ändere die untere Position auf Stunden.

public class PositionChangedEventArgs : EventArgs 
{ 
    public PositionChangedEventArgs(int seconds) 
    { 
     Seconds = seconds; 
    } 

    public int Seconds { get; set; } 
} 

public interface IAudio 
{ 
    ... 
    event EventHandler<PositionChangedEventArgs> PositionChanged; 
} 

Dann wird in den Event-Handler für Position, würden Sie die Position des Schiebers aktualisieren:

// note that we're caching our reference to IAudio; 
// I don't know whether it's a singleton or not 
var audioService = DependencyService.Get<IAudio>(); 
TimeSpan timeSpan = audioService.GetInfo(); 
Label lblDuration = new Label { Text = String.Format("{0:hh\\:mm\\:ss}", timeSpan) }; 

var slider = new Slider { 
    Minimum = 0, 
    Maximum = timeSpan.TotalSeconds, 
}; 
audioService.PositionChanged += (s, e) => { 
    slider.Value = e.Position; 
    label.Text = String.Format("Slider value is {0}", e.Position); 
} 
+0

Sorry, my bad. Ich möchte, dass der Slider die Sekunde verfolgt. :-( – Arti

+0

Ich habe meine Frage zu der hinzugefügten Schnittstelle Klassenstruktur bearbeitet – Arti

+0

Ich kann Ereignis PositionChanged auf der Schnittstelle nicht hinzufügen, erhalten 'Fehler Erwartete Klasse, Delegieren, Aufzählung, Schnittstelle oder Struktur" – Arti