2016-05-13 3 views
0

Я хотел бы использовать ползунок для управления xamarin.forms как панель аудиоплеера. У меня есть служба зависимостей, чтобы воспроизвести запись и получить общую продолжительность и текущую позицию. Как нужно будет установить его на мой слайдер?Ползунок Xamarin.forms как панель аудиоплеера

Ее мой код:

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

Я устанавливаю общую продолжительность в этикетке. Как мне настроить программу на слайдер изменения, чтобы установить метку на текущая позиция. И как будет изменяться значение ползунка на основе воспроизводимого файла?

Редактировать

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

     } 
    } 
} 

ответ

1

Прежде чем ответить на этот вопрос, позвольте мне задать вам один из моих собственных: действительно ли вы хотите ползунок отслеживать часы? Я ожидал бы, что медиа-слайдер будет отслеживать секунды или десятые секунды; часы - очень грубый шаг.

Предполагая, что вы являетесь автором интерфейса IAudio и его реализации, моя рекомендация будет для интерфейса IAudio разоблачить и огонь событие (например: PositionChanged), который включает в себя текущее положение всякий раз, когда изменяется положение воспроизведения. Реализация интерфейса IAudio выходит за рамки этого вопроса, но я ожидаю, что вы подпишетесь на мероприятие или зарегистрируете обратный вызов с использованием любого используемого медиа-стека, и это, в свою очередь, вызовет событие PositionChanged.

ПРИМЕЧАНИЕ. Я также предполагаю, что вы действительно имели в виду секунды; если вы действительно определили часы, измените нижнюю позицию на Часы.

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

    public int Seconds { get; set; } 
} 

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

Затем, в обработчик событий для PositionChanged, вы обновите положение ползунка:

// 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

К сожалению, моему плохому. Я бы хотел, чтобы ползунок отслеживал второй. :-( – Arti

+0

Я изменил свой вопрос на добавленную структуру класса интерфейса – Arti

+0

Я не могу добавить событие PositionChanged на интерфейс, получив 'Error Ожидаемый класс, делегат, перечисление, интерфейс или структура – Arti