func stopPlayMusic() {
if (self.isStop == true) {
self.player.pause()
btn .setTitle("播放", forState:UIControlState.Normal)
//var paused = player.currentTime
self.songImageView.layer.speed = 0.0
}else{
self.player.play()
btn .setTitle("暂停", forState:UIControlState.Normal)
self.songImageView.layer.beginTime = player.currentTime
self.songImageView.layer.speed = 0.1
}
isStop = !isStop
}
func downloadData(path: NSString,dataHandler: (NSData)->Void){
var url = NSURL(string: path)
var request = NSURLRequest(URL: url)
var mainQueue = NSOperationQueue.mainQueue()
NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue) {
(response:NSURLResponse!, data:NSData!, error:NSError!) -> Void in
var httpResponse = response as NSHTTPURLResponse
if httpResponse.statusCode == 200 {
dataHandler(data)
}
}
}
func downloadSong(path: NSString) {
self.downloadData(path, dataHandler: { (data: NSData) -> Void in
self.playSong(data)
})
}
func downloadSongLrc(path: NSString) {
var lrcPath = "http://ting.baidu.com\(path)"
self.downloadData(lrcPath, dataHandler: { (data: NSData) -> Void in
var lrc = NSString(data: data, encoding:NSUTF8StringEncoding)
var lrcLists = lrc.componentsSeparatedByString("\n") as NSArray
println("\(lrc)")
println("\(lrcLists[5])")
})
}
func loadSongMessage(id: Int) {
var path = "http://music.baidu.com/data/music/fmlink?type=mp3&rate=1&format=json&songIds=\(id)"
downloadData(path, dataHandler: { (data: NSData) -> Void in
var array: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error:nil) as NSDictionary
var dataDic: NSDictionary = array["data"] as NSDictionary
var list:NSArray = dataDic["songList"] as NSArray
var songDic:NSDictionary = list[0] as NSDictionary
self.currentSong.refreshSong(songDic)
self.title = self.currentSong.songName
println("\(songDic)")
self.playImage(self.currentSong.songPicRadio)
self.showSongInfo()
self.downloadSong(self.currentSong.songLink)
self.downloadSongLrc(self.currentSong.lrcLink)
})
}
func playImage(path: NSString) {
if path == "" {
self.songImageView.backgroundColor = UIColor.cyanColor()
}else{
var url = NSURL(string: path)
var data = NSData(contentsOfURL: url, options: nil, error: nil)
var image = UIImage(data: data)
self.songImageView.image = image
}
self.songImageView.contentMode = UIViewContentMode.ScaleAspectFit
self.songImageView.layer.cornerRadius = self.songImageView.frame.width/2
self.songImageView.layer.masksToBounds = true
self.songImageView.userInteractionEnabled = true
var ges = UITapGestureRecognizer(target: self, action:"tapImageView:")
self.songImageView.addGestureRecognizer(ges)
}
func showSongInfo() {
self.artistName.text = self.currentSong.artistName
self.songName.text = self.currentSong.songName
self.timeLabel.text = "00:00"
}
func loadSongList() {
var path = "http://fm.baidu.com/dev/api/?tn=playlist&special=flash&prepend=&format=json&_=1378945264366&id="+String(channel.id)
downloadData(path, dataHandler: { (data: NSData) -> Void in
var dic: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error:nil) as NSDictionary
var list: NSArray = dic["list"] as NSArray
for dict in list{
var song = Song()
song.id = dict["id"] as Int
self.songList.append(song)
}
if self.songList.count != 0 {
self.currentSong = self.songList[0]
self.loadSongMessage(self.currentSong.id)
}
})
}
func doAnimation() {
var animation = CABasicAnimation(keyPath: "transform.rotation.z")
animation.toValue = NSNumber(double: 2.0*M_PI)
animation.duration = 1.5
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
animation.removedOnCompletion = false
animation.cumulative = false
animation.repeatCount = FLT_MAX
self.songImageView.layer.addAnimation(animation, forKey: "AnimatedKey")
self.songImageView.layer.speed = 0.1
}
func tapImageView(sender:UITapGestureRecognizer){
self.stopPlayMusic()
}
override func viewDidLoad() {
super.viewDidLoad()
//self.title = channel.title
loadSongList()
self.view.backgroundColor = UIColor(red: 218/255.0, green: 225/255.0, blue: 230/255.0, alpha: 1)
println("\(channel.id)")
}
override func viewWillDisappear(animated: Bool) {
timer.invalidate()
self.songImageView.stopAnimating()
player.stop()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func AudioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) {
timer.invalidate()
self.songImageView.layer.speed = 0
self.songImageView.stopAnimating()
var index = self.currentIndex + 1
loadSongWithIndex(index)
}
这个项目是一个比较不错的ZLMusic模仿百度音乐应用,也是采用Swift开发的百度音乐电台,基本模仿了现实中的百度音乐应用功能了,支持播放功能,上首歌,下一首个,以及歌曲分类等。
项目源码下载:http://code.662p.com/view/9375.html
-
运行截图
-
运行截图
-
运行截图