有关音乐播放器的仿码_第1页
有关音乐播放器的仿码_第2页
有关音乐播放器的仿码_第3页
有关音乐播放器的仿码_第4页
有关音乐播放器的仿码_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大家好!这个 demo 是有关 音乐播放器的 仿码,能够实现音乐播放器的基本功能.当然,如果你想要更加酷炫的效果,那么你可以在里面添加一些动画效果.还有,如果你想要使用它的话,最好先仔细分析一下,注意代码里面的一些内容,包括MVVM 模式的运用.希望能够帮到大家!谢谢!/ Copyright 2016年 ttf. All rights reserved./注意这个只有ViewController部分的代码,原因你是知道的.#import ViewController.h#import Masonry.h#import MJExtension.h#import TTFMusicModel.h#i

2、mport TTFMusicPlayerTool.h#import TTFLyricModel.h#import TTFColorLabel.h#import TTFLyricParserTool.h#import TTFLyricView.h#import interface ViewController ()/ 背景图片property (weak, nonatomic) IBOutlet UIImageView *bgImageView;/ 播放按钮property (weak, nonatomic) IBOutlet UIButton *playBtn;/ 上一首property (w

3、eak, nonatomic) IBOutlet UIButton *previousBtn;/ 下一首property (weak, nonatomic) IBOutlet UIButton *nextBtn;/ 当前时间(label)property (weak, nonatomic) IBOutlet UILabel *currentLabel;/ 总时间property (weak, nonatomic) IBOutlet UILabel *durationLabel;/ sliderproperty (weak, nonatomic) IBOutlet UISlider *slide

4、r;/ 中间的viewproperty (weak, nonatomic) IBOutlet UIView *centerView;/ 歌手labelproperty (weak, nonatomic) IBOutlet UILabel *singerLabel;/ 歌手图片property (weak, nonatomic) IBOutlet UIImageView *singerIconImageView;/ 歌词labelproperty (weak, nonatomic) IBOutlet TTFColorLabel *lyricLabel;/ 专辑labelproperty (wea

5、k, nonatomic) IBOutlet UILabel *albumLabel;/设置的view,上面有一个scrolView,然后scrolView里面还有一个scrolViewproperty (weak, nonatomic) IBOutlet TTFLyricView *lyricView;/存放 歌曲模型 的 数组property(strong,nonatomic)NSArray *musicsModelArray;/当前歌曲的索引(凭借索引找到歌曲)property(assign,nonatomic)NSInteger currentMusicIndex;/定时器proper

6、ty(strong,nonatomic) NSTimer *timer;/存放歌词的数组property(strong,nonatomic)NSArray *lyricArray;endimplementation ViewController/这是使用框架做出来的-(NSArray *)musicsModelArray if (_musicsModelArray = nil) / _musicsModelArray = TTFMusicModel objectArrayWithFile:mlist.plist; _musicsModelArray = TTFMusicModel object

7、ArrayWithFilename:mlist.plist; return _musicsModelArray;- (void)viewDidLoad super viewDidLoad; / 添加 bgImageView 的毛玻璃效果 UIToolbar *toolBar = UIToolbar allocinit; toolBar.barStyle = UIBarStyleBlack; self.bgImageView addSubview:toolBar; /添加约束 toolBar mas_makeConstraints:(MASConstraintMaker *make) make.

8、edges.mas_equalTo(0); ; /调用 self setupUI; /遵守协议,设置代理对象,实现代理方法 self.lyricView.delegate = self;-(void)viewWillLayoutSubviews /如果在 viewDidLoad 里面写的话,会因为 是 预加载 而导致 错略 截取圆形. /如果 加上 self.view = self.singerIconImageView.layer.cornerRadius = self.singerIconImageView.bounds.size.width * 0.5; /为什么还没有显示截图?就是因为

9、没有添加约束 self.singerIconImageView.layer.masksToBounds = YES;/ 更改约束- (void)viewDidLayoutSubviews super viewDidLayoutSubviews; #pragma mark - 设置 UI 界面的静态控件(思路:model赋值)-(void)setupUI /首先获取到模型(模型里面的值因为懒加载放到模型数组里面了,现在在 .m 文件里面只有用新创建的musicModel 来接收 存放在懒加载后的 模型数组里面的内容了! ) TTFMusicModel *musicModel = self.mus

10、icsModelArrayself.currentMusicIndex; / 歌词数组 self.lyricArray = TTFLyricParserTool lyricParserWithFileName:musicModel.lrc; self.lyricView.lyricsArray = self.lyricArray; /给各个静态的控件赋值 /singer self.singerLabel.text = musicModel.singer; /album self.albumLabel.text = musicModel.album; self.playBtn.selected

11、= NO; /点击下一首就会调用 setupUI,然后执行添加上的 关闭定时器 方法,这个方法就不会执行 随着定制器的的更新让图片旋转. /不管怎么样先关闭定时器,图片就不会执行旋转. self turnOFFTimer; self playBtnClick; /然后调用 playBtnClick 方法里面自然就有开启的方法. 保证在用到的时候才开启定时器! /duration (需要完成工具类,然后才能够调用) TTFMusicPlayerTool *musicPlayerTool = TTFMusicPlayerTool shareInstance; self.durationLabel.

12、text = self stringWithTime:musicPlayerTool.duration; /singerIconImageView(先获取再赋值) UIImage *image = UIImage imageNamed:musicModel.image; self.bgImageView.image = image; self.singerIconImageView.image = image; /类型 不匹配 ,需要把时间转换成为 字符串(string 在前面,就是转换成为谁)- (NSString *)stringWithTime:(NSTimeInterval)time

13、int minute = time / 60; int second = (int)time % 60; return NSString stringWithFormat:%02d:%02d,minute,second;- (void)didReceiveMemoryWarning super didReceiveMemoryWarning; / Dispose of any resources that can be recreated./ 播放 音乐 方法- (IBAction)playBtnClick /用自己创建的播放音乐的工具类 来调用播放方法 TTFMusicPlayerTool

14、*musicPlayerTool = TTFMusicPlayerTool shareInstance; /还需要 歌曲的名字: model 里面的mp3属性 文件里面有歌曲的名称 TTFMusicModel *musicModel = self.musicsModelArrayself.currentMusicIndex; if (self.playBtn.selected) /如果播放按钮已经被点击了 是真,那就执行:再次点击 就应该是暂停 musicPlayerTool pause; / 关闭定时器 self turnOFFTimer; else musicPlayerTool play

15、MusicWithFileName:musicModel.mp3 andDidComplete: self nextBtnClick; ; / 开启定时器 self turnONTimer; /上面的逻辑判断是对的,但是没有烤考虑到要记录和重置按钮的状态. /此处应该记录按钮的点击状况(状态) self.playBtn.selected = !self.playBtn.selected;/ 上一首- (IBAction)previousBtnClick / /上一首应该 让获取的 歌曲模型数组的下标递减 : -/ self.musicsModelArray. /上面的方法可以 询问 别人,看能

16、否得到帮助! /下面使用了 歌曲索引值 /减一 的 结果会 导致 越界,所以需要判断一下 if (self.currentMusicIndex = 0) self.currentMusicIndex = self.musicsModelArray.count - 1; else self.currentMusicIndex -; / self.playBtn.selected = NO;/ /调用播放的方法/ self playBtnClick; self setupUI;/ 下一首- (IBAction)nextBtnClick /获取的歌曲模型数组的字表递增 : + if (self.cu

17、rrentMusicIndex = self.musicsModelArray.count - 1) self.currentMusicIndex = 0; else self.currentMusicIndex +; / self.playBtn.selected = NO;/ /调用播放的方法/ self playBtnClick; self setupUI;/ 滑块滑动- (IBAction)sliderValueChange:(id)sender /首先获取到 自己创建的播放音乐的工具类 TTFMusicPlayerTool *musicPlayerTool = TTFMusicPla

18、yerTool shareInstance; musicPlayerTool.current = self.slider.value * musicPlayerTool.duration;#pragma mark - 定时器 打开-(void)turnONTimer self.timer = NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:selector(updateWithTimer) userInfo:nil repeats:YES; #pragma mark - 实现方法,让 四个动态的控件的内容 随着 定

19、时器 的 变化而变化-(void)updateWithTimer /图片 /这个方法是专门 的 实现 让 imageView 随着定时器的时间 变化而转动 多少角度的. self.singerIconImageView.transform = CGAffineTransformRotate(self.singerIconImageView.transform, M_PI_2 * 0.008); /歌词(封装成为一个方法了,直接调用即可) self updateLyrics; /current (Label) /工具类的 单例创建的 工具类的对象 TTFMusicPlayerTool *musi

20、cPlayerTool = TTFMusicPlayerTool shareInstance; self.currentLabel.text = self stringWithTime:musicPlayerTool.current; /slider 的值 self.slider.value = musicPlayerTool.current/musicPlayerTool.duration; /锁屏幕状态 self lockScreen;#pragma mark - 实现 更新歌词的 方法-(void)updateLyrics /工具类的 单例创建的 工具类的对象 TTFMusicPlaye

21、rTool *musicPlayerTool = TTFMusicPlayerTool shareInstance; /一次获取两行的歌词 /要判断该显示哪一行的歌词 for (int i = 0; iself.lyricArray.count; i+ ) TTFLyricModel *currentLyric = self.lyricArrayi; TTFLyricModel *nextLyric = nil; if (i = self.lyricArray.count - 1) nextLyric = self.lyricArrayi; else nextLyric = self.lyri

22、cArrayi +1; /比较大小 并且 获取到当前行 的歌词 if (currentLyric.time musicPlayerTool.current & musicPlayerTool.current nextLyric.time ) self.lyricLabel.text = currentLyric.content; CGFloat progress = (musicPlayerTool.current - currentLyric.time) / (nextLyric.time -currentLyric.time); /这个位置想要 能 使用点语法 的progress属性,就需

23、要修改 .m 文件里面 lyricLabel 的类名,改成自定义的 TTFColorLabel ,才能够完成赋值. self.lyricLgress = progress; /此处是处理 VscrolView 的 歌词进度的问题的. self.lyricView.currentlyric = i; self.lyricVgress = progress; #pragma mark - 定时器 关闭-(void)turnOFFTimer self.timer invalidate; self.timer = nil;#pragma mark - TTFLyricVi

24、ew 的代理方法-(void)lyricView:(TTFLyricView *)lyricView hScrollViewDidScroll:(CGFloat)progress /本来是等于进程 progress 的,但是发现效果相反,所以用1 - progress 试试,发现可以. self.centerView.alpha = 1 - progress;- (void)lockScreen TTFMusicModel *musicModel = self.musicsModelArrayself.currentMusicIndex; TTFMusicPlayerTool *musicPl

25、ayerTool = TTFMusicPlayerTool shareInstance; MPNowPlayingInfoCenter *nowPlayingInfoCenter = MPNowPlayingInfoCenter defaultCenter; NSMutableDictionary *info = NSMutableDictionary dictionary; /* / MPMediaItemPropertyAlbumTitle / MPMediaItemPropertyAlbumTrackCount / MPMediaItemPropertyAlbumTrackNumber

26、/ MPMediaItemPropertyArtist / MPMediaItemPropertyArtwork / MPMediaItemPropertyComposer / MPMediaItemPropertyDiscCount / MPMediaItemPropertyDiscNumber / MPMediaItemPropertyGenre / MPMediaItemPropertyPersistentID / MPMediaItemPropertyPlaybackDuration / MPMediaItemPropertyTitle */ infoMPMediaItemProper

27、tyAlbumTitle = musicModel.album; infoMPMediaItemPropertyArtist = musicModel.singer; infoMPMediaItemPropertyArtwork = MPMediaItemArtwork alloc initWithImage:self lyricImage; infoMPMediaItemPropertyPlaybackDuration = (musicPlayerTool.duration); infoMPMediaItemPropertyTitle = musicM; infoMPNow

28、PlayingInfoPropertyElapsedPlaybackTime = (musicPlayerTool.current); nowPlayingInfoCenter.nowPlayingInfo = info;- (UIImage *)lyricImage CGSize screenSize = self.view.bounds.size; CGFloat min = MIN(screenSize.width, screenSize.height); CGFloat lyricWidth = min * 0.8; CGFloat lyricHeight = lyricWidth;

29、TTFMusicModel *musicModel = self.musicsModelArrayself.currentMusicIndex; / 进行绘制 UIGraphicsBeginImageContext(CGSizeMake(lyricWidth, lyricHeight); UIImage *bgImage = UIImage imageNamed:musicModel.image; bgImage drawInRect:CGRectMake(0, 0, lyricWidth, lyricHeight); UIImage *bgLyricImage = UIImage image

30、Named:lock_lyric_mask; CGFloat height = 40; CGFloat width = lyricWidth; CGFloat x = 0; CGFloat y = lyricHeight - height; bgLyricImage drawInRect:CGRectMake(x, y, width, height); NSString *lyric = self.lyricLabel.text; CGFloat height1 = 20; CGFloat width1 = lyricWidth; CGFloat x1 = 0; CGFloat y1 = lyricHeight - height1; UIColor whiteColor set; lyric drawInRect:CGRectMake(x1, y1, width1, height1) withFont:UIFont systemFontOfSize:17 lineBreakMode:0 alignment:NSTextAlign

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论