王涛的播放器

昨天晚上做的音乐播放器忘了发博客,今天完善了一下,一起发上来总结一下吧。
这两天做的音乐播放器,只有一个界面的内容,而且无法显示歌词,功能还有有欠缺,所以我在这方面跟时间比较长的同学还是比不上的。
首先创一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值