Winows Phone 7 - 音樂播放示例

openkk 13年前發布 | 19K 次閱讀 Windows Phone開發 移動開發 Winows Phone

微軟的Microsoft.Xna.Framework.Media組件中自帶有MediaPlayer的庫,其中庫里面存放有三首曲子,我們可以通過引 用該組件來調用庫中相應的函數進行歌曲播放,通過引用Microsoft.Xna.Framework.dll,引用該命名空間即可使用該 組件。

這個DEMO是一個音樂播放的小例子,界面如下:

Winows Phone 7 - 音樂播放示例

如上圖,有四個控件,一個圖片控件,一個文本控件,兩個控制按鈕。當頁面被導航進來時,得到一個Song類型的歌曲,并為文本控件賦值歌曲名稱。得到類型后,在頁面初始完成時,得到一張歌曲的封面并為圖片控件賦值。下面是整個應的代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Media;
using System.Windows.Threading;
using System.IO;
using System.Windows.Resources;
using System.Windows.Media.Imaging;namespace PostCodeManager
{
public partial class MainPage : PhoneApplicationPage
{

region 成員聲明

Song _playSong; //聲明一個Song 類型的變量 bool _historyItemLaunch; const String _playSongKey = "playSong";

endregion// Constructor

public MainPage() { InitializeComponent(); _playSong = null; _historyItemLaunch = false;//聲明一個Timer 使用線程運行 XNA internals 來自于微軟XNA框架 DispatcherTimer dt = new DispatcherTimer(); dt.Interval = TimeSpan.FromMilliseconds(33); //使用委托調用逐幀調用 FrameworkDispatcher.Update(); dt.Tick += delegate { try { // 這個函數作用是更新各種XNA組件狀態,并觸發相應的事件,這個是必須的,否則會報異常 FrameworkDispatcher.Update();

} catch {

throw; } }; dt.Start();+= new EventHandler

<eventargs>




       (MediaPlayer_MediaStateChanged);

}///

 <summary> /// 當頁面進入時調用

/// </summary> ///

 <param name="e"></param> protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)

{ MediaLibrary library = new MediaLibrary(); if (NavigationContext.QueryString.ContainsKey(_playSongKey)) { String songToPlay = NavigationContext.QueryString[_playSongKey]; foreach (Song song in library.Songs) { if (0==String.Compare(songToPlay,song.Name)) { _playSong = song; } } _historyItemLaunch = true; } else if (MediaPlayer.State==MediaState.Playing) { _playSong = MediaPlayer.Queue.ActiveSong; } else { Random rd = new Random(); if (library.Songs.Count>0) { _playSong = library.Songs[rd.Next(library.Songs.Count)]; } else { SongName.Text = "no songs in library"; btn_play_music.IsEnabled = false; } }base.OnNavigatedTo(e); }void MediaPlayer_MediaStateChanged(object sender, EventArgs e) { switch (MediaPlayer.State) {

case MediaState.Playing: btn_play_music.IsEnabled = false; btn_stop.IsEnabled = true; break; case MediaState.Paused: case MediaState.Stopped: btn_play_music.IsEnabled = true; btn_stop.IsEnabled = false; break; } }///

 <summary> /// 為主窗體添加UI加載完成后的事件

/// </summary> ///

 <param name="sender"></param> /// 





 <param name="e"></param> private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)

{ PopulateSongMetaData(); setInitialButtonState(); if (_historyItemLaunch) { playSong(); } } ///

 <summary> /// 開始播放音樂 

/// </summary> ///

 <param name="sender"></param> /// 





 <param name="e"></param> private void btn_play_music_Click(object sender, RoutedEventArgs e)

{ playSong(); }///

 <summary> /// 停止播放音樂

/// </summary> ///

 <param name="sender"></param> /// 





 <param name="e"></param> private void btn_stop_Click(object sender, RoutedEventArgs e)

{ stopSong(); }///

 <summary> /// 播放

/// </summary> private void playSong() { if (_playSong!=null) { MediaPlayer.Play(_playSong); } } ///

 <summary> /// 停止

/// </summary> private void stopSong() { if (MediaState.Playing==MediaPlayer.State) { MediaPlayer.Stop(); } }///

 <summary> /// 使用圖片讀取圖片封面

/// </summary> private void PopulateSongMetaData() { if (_playSong!=null) { SongName.Text = _playSong.Name; Stream albumArtStream = _playSong.Album.GetAlbumArt(); if (albumArtStream==null) { StreamResourceInfo albumArtPlaceholder = Application.GetResourceStream(new Uri("ApplicationIcon.png", UriKind.Relative)); albumArtStream = albumArtPlaceholder.Stream; } BitmapImage albumArtImage = new BitmapImage(); albumArtImage.SetSource(albumArtStream); cover.Source = albumArtImage; } }///

 <summary> /// 初始化按鈕 

/// </summary> private void setInitialButtonState() { switch (MediaPlayer.State) {case MediaState.Playing: btn_play_music.IsEnabled = false; btn_stop.IsEnabled = true; break; case MediaState.Paused: case MediaState.Stopped: btn_play_music.IsEnabled = true; btn_stop.IsEnabled = false; break; } }

MediaPlayer.MediaStateChanged ; } }

</eventargs></pre></span>TIP:OnNavigatedTo方法是一個重寫系統事件的方法,此方法以檢查導航請求并且準備供顯示的頁面,為一些必要的組件和處理邏輯提供處理任 務,上一篇提到過工程里面包含有一張圖片為SplashScreenImage.jpg,這張圖片就是就是為處理方法提供的臨時頁面。這個做法好處在于, 用戶會認為程序啟動時和啟動后都是一致的,當我們真正程序啟動完成 


后,要做一些頁面其他的加載,就可以在pageLoad 里面處理。下面為了證實我所說的,來調試一下吧,首先我們在OnNavigatedTo
的入口處加一個斷點,按F5進入調試模式,我們來看看程序是怎么跑的。如圖:

Winows Phone 7 - 音樂播放示例

如圖,重寫這個方法是不是很不錯,在Android 我記得是沒有這個事件可以重寫的,如果有的話,請麻煩告知一聲。謝謝。那么你還在想什么?趕快動手吧,播放一下聽聽。

源碼下載 : 猛擊點我

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!