昨天晚上做的音乐播放器忘了发博客,今天完善了一下,一起发上来总结一下吧。
这两天做的音乐播放器,只有一个界面的内容,而且无法显示歌词,功能还有有欠缺,所以我在这方面跟时间比较长的同学还是比不上的。
首先创一个Object文件,我还做了4个按键,开始/暂停、下一曲、上一曲、停止。然后做了几首歌曲连播,同时在点击下一曲的同时还有背景的转换。
同时也发现了自己的两个问题,如果琼哥或珊哥看到了 求指教~
第一个:我现在的代码自己能独立解决的很少,有些不懂的,然后看得久了就脑壳发晕,所以习惯去请教别人。我想问一下,如果想不通了,主动、时常请教别人,会不会导致我在以后的工作中有什么坏处
第二个:写代码、查代码有很多技巧,但是我现在感觉跟不上,所以觉得时间很紧,顾得了这里,忘了那里,顾得了那里,忘了这里,有什么建议么
废话不多说了,下面把我的代码列出来:
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
{
AVAudioPlayer *player;
int index;
int picIndex;
NSArray *musiclist;
NSArray *picturelist;
int flag;
NSTimer *timer;
UIButton *playBtn;
UILabel *label;
UIImageView *imageView;
//!!!! 全局变量与局部变量的差别,注意一些差点遗忘的问题:1,出现问题时,如果想学好需要立刻动笔,做下笔记。2,关于定义的问题,全局定义和局部定义的问题,有时候想不到不是我不知道,而是压根没往那处想,还是不熟悉,需要花时间额外疏通疏通。3,多多看代码,熟悉结构,看清全局,这样会对在一些前后定义、方法引用等等其他方面是会有好处的。4,我还是个菜鸟,革命道路很漫长~ 哈哈
}
@property (weak, nonatomic) IBOutlet UISlider *progressSlide;
@end
@implementation ViewController
int a=1;
- (void)viewDidLoad
{
[super viewDidLoad];
[self createBtn];
label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100,30)];
label.textColor = [UIColor colorWithRed:63/255.0 green:130/255.0 blue:139/255.0 alpha:0.7];
label.numberOfLines = 0;
[self.view addSubview:label];
imageView=[[UIImageView alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
imageView.image=[UIImage imageNamed:@"汽车背景"];
[self.view addSubview:imageView];
imageView.alpha=0.4;
picturelist = @[@"汽车背景",@"性感图片",@"男人"];
musiclist = @[@"平凡之路", @"Pretty",@"小情歌",@"我相信",@"Disneyland",@"少女时代 - Oh! 音乐中心20100313版"];
NSString *name=musiclist[index];
NSString *path=[[NSBundle mainBundle]pathForResource:name ofType:@"mp3"];
NSURL *url = [NSURL fileURLWithPath:path];
label.text=musiclist[index];
player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
[player prepareToPlay];
[player play];
timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(refreshProgress) userInfo:nil repeats:YES];
}
-(void)createBtn
{
playBtn = [self configuerButton:CGRectMake(115, 370, 80, 80) imageNamed:@"play.png" action:@selector(didplayed)]; // 这个东西解决了我一个疑惑, 就是全都封装以后,我怎么得到按钮的对象问题,1,先在interface处定义一下对象,然后将封装后,你想得到的,那个按键,用赋值给刚定义的对象。有时间多多看看,想清楚其中的奥妙。
[self configuerButton:CGRectMake(205, 400, 25, 25) imageNamed:@"next.png" action:@selector(didnexted)];
[self configuerButton:CGRectMake(80,400, 25, 25) imageNamed:@"last.png" action:@selector(didlasted)];
[self configuerButton:CGRectMake(30, 400, 25, 25) imageNamed:@"stop.png" action:@selector(didstoped)];
}
-(UIButton *)configuerButton: (CGRect)frame imageNamed:(NSString *)imageNamed action:(SEL)action
{ // 这一段是封装。 函数名+“:”+参数名的结构,参数名可以看情况添加,另外如果有按键需要被对象使用的话,还需要去一个返回值。用“UIButton”做类。返回“btn”值
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame =frame;
btn.tintColor=[UIColor blackColor];
[btn setImage:[UIImage imageNamed:imageNamed] forState:UIControlStateNormal];
[btn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
return btn;
}
-(void)didstoped
{
[player stop];
}
-(void)didnexted
{
picIndex++;
index++;
if(index==musiclist.count)
{
index = 0 ;
}
if (picIndex == picturelist.count)
{
picIndex = 0;
}
UIImage *image1 = [UIImage imageNamed:picturelist[picIndex]];
imageView.image = image1;
label.text=musiclist[index];
[timer invalidate];
[self didplayed];
}
上一段代码是“下一曲”的功能实现,由interface 定义了两个变量“index”“picIndex”来作为数组的变量。通过数组的逐个输出来得到我们对歌曲逐个更换的目的。由“1”遍历到“musiclist.count”和"picturelist.count"两个最大值来进行歌曲的连续播放。
-(void)didlasted
{
picIndex--;
index--;
if(index<0)
{
index = musiclist.count - 1;
}
if (picIndex<0)
{
picIndex = picturelist.count - 1;
}
UIImage *image = [UIImage imageNamed:picturelist[picIndex]];
imageView.image = image;
label.text=musiclist[index];
[timer invalidate];
[self didplayed];
}
上一段代码跟“下一曲”功能相同,可参照。
-(void)didplayed
{
flag+=1;
if(flag%2==1)
{
[player pause];
// [self->player play];
[playBtn setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal];
}
else
{
[player prepareToPlay];
[playBtn setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal];
[player play];
}
}
这个代码是在一个按键中实现“播放”和“暂停”的交替,点击一下是播放,在点击以下是暂停,如此可用一个判断语句来实现,其实很多语句不像我们想的那么难,多少还是有一点规律的,虽然我还只是在寻找。。。
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
index++;
if(index==musiclist.count)
{
index = 0 ;
}
[timer invalidate];
[self didplayed];
}
这是一个列表循环的功能实现代码。index 逐一增加。直到它的最大值,然后再赋值 0 ,重新开始。
- (void)refreshProgress
{
self.progressSlide.value = player.currentTime / player.duration;
}
这段代码是一个进度条的取值公式: 播放器的当前播放时间 / 播放器的总时间。 得到一个大于0 小于1的 进度条值。
- (IBAction)progress:(UISlider *)sender
{
player.currentTime = sender.value * player.duration;
NSLog(@"progress: %f", player.currentTime);
}
这个代码是进度条当前播放了多少秒,是进度条取值 * 播放器的总时间; 得到音乐播放的时间。
- (IBAction)volume:(UISlider *)sender
{
player.volume = sender.value;
}
这个代码是音乐播放器的声音的调节,将进度条的值赋值给音量。通过比例还决定音量的大小。
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
王涛的播放器
最新推荐文章于 2021-12-24 15:30:39 发布