本次的要求是做出一个简易的带滚动条的音频播放界面。(为了不影响大家学习,完整代码在文章最后附加)
第一部分:滚动条的实现(此处用的是安卓自带的SeekBar)
布局文件:
<SeekBar
android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" />Java代码:
private void initViews(){
music=(EditText)findViewById(R.id.music);//在布局中定义好的一个用来传输要播放网络文件位置的文本 playBtn=(ImageButton)findViewById(R.id.play); seekBar=(SeekBar)findViewById(R.id.seekBar);//给滚动条设置监听事件,重写了三个方法,此处只用到后两个
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}
//开始触摸
@Override public void onStartTrackingTouch(SeekBar seekBar) { isChange=true; }//停止触摸
@Override public void onStopTrackingTouch(SeekBar seekBar) { //设置歌曲的进度为当前seekBar的进度 player.seekTo(seekBar.getProgress()); isChange=false; } });
第二部分:使用MediaPalyer加载音乐文件
player=new MediaPlayer();
Uri uri=Uri.parse(music.getText().toString()); try { player.setDataSource(this, uri); //异步加载媒体流 player.prepareAsync();//添加一个准备状态的监听事件
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { //准备完毕 //开启定时器设置进度条(第三部分),必须要在准备完成后才可以调用定时器方法,将两部分相关联 initTimer(); Toast.makeText(MediaDemoActivity.this, "歌曲准备完毕", Toast.LENGTH_SHORT).show(); player.start();//改变此时的ImageButton的样式
playBtn.setImageResource(R.mipmap.a8o); findViewById(R.id.back).setOnClickListener(MediaDemoActivity.this); playBtn.setOnClickListener(MediaDemoActivity.this); findViewById(R.id.to).setOnClickListener(MediaDemoActivity.this); } });//设置一个特殊情况的监听:比如断网,网络歌曲不存在之类的
player.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { //出现错误 Toast.makeText(MediaDemoActivity.this, "无网络或歌曲链接无效", Toast.LENGTH_SHORT).show(); return false; } });//播放完成监听
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { //播放完毕 } }); } catch (IOException e) { e.printStackTrace(); } }第三部分:使用定时器将进度条与音频文件关联起来
private void initTimer(){
//设置进度条长度 seekBar.setMax(player.getDuration()); timer=new Timer(); task=new TimerTask() { @Override public void run() { //定时器执行:设置进度条 if(!isChange) { seekBar.setProgress(player.getCurrentPosition()); } } }; timer.schedule(task,0,1000); }
附加代码:
private EditText music;
private MediaPlayer player; private ImageButton playBtn;//播放键 private SeekBar seekBar; private Timer timer; private TimerTask task; private boolean isChange;//默认没有拖拽@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_media_demo); initViews(); }private void initViews(){
music=(EditText)findViewById(R.id.music); playBtn=(ImageButton)findViewById(R.id.play); seekBar=(SeekBar)findViewById(R.id.seekBar); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}
//开始触摸
@Override public void onStartTrackingTouch(SeekBar seekBar) { isChange=true; }//停止触摸
@Override public void onStopTrackingTouch(SeekBar seekBar) { //设置歌曲的进度为当前seekBar的进度 player.seekTo(seekBar.getProgress()); isChange=false; } }); findViewById(R.id.start).setOnClickListener(this); findViewById(R.id.pause).setOnClickListener(this); findViewById(R.id.stop).setOnClickListener(this); findViewById(R.id.restart).setOnClickListener(this); findViewById(R.id.copy).setOnClickListener(this); //输入框修改监听 music.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) { //当音乐发生变化时,停止播放// stopPlay(); } }); player=new MediaPlayer(); Uri uri=Uri.parse(music.getText().toString()); try { player.setDataSource(this, uri); //异步加载媒体流 player.prepareAsync(); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { //准备完毕 //开启定时器设置进度条 initTimer(); Toast.makeText(MediaDemoActivity.this, "歌曲准备完毕", Toast.LENGTH_SHORT).show(); player.start(); playBtn.setImageResource(R.mipmap.a8o); findViewById(R.id.back).setOnClickListener(MediaDemoActivity.this); playBtn.setOnClickListener(MediaDemoActivity.this); findViewById(R.id.to).setOnClickListener(MediaDemoActivity.this); } }); player.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { //错误监听 Toast.makeText(MediaDemoActivity.this, "无网络或歌曲链接无效", Toast.LENGTH_SHORT).show(); return false; } }); player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { //播放完毕 } }); } catch (IOException e) { e.printStackTrace(); } }private void initTimer(){
//设置进度条长度 seekBar.setMax(player.getDuration()); timer=new Timer(); task=new TimerTask() { @Override public void run() { //定时器执行:设置进度条 if(!isChange) { seekBar.setProgress(player.getCurrentPosition()); } } }; timer.schedule(task,0,1000);private void play(){
//判断当前是否正在播放歌曲 if(player.isPlaying()) { //播放就暂停 playBtn.setImageResource(R.mipmap.a8q); player.pause(); } else { //未播放就开始播放 playBtn.setImageResource(R.mipmap.a8o); player.start(); } }private void toPlay() {
//快进5秒 //先获取当前正在播放的位置 int currentPosition=player.getCurrentPosition(); //获取歌曲总长度 int duration=player.getDuration(); //当前位置添加五秒后不大于歌曲总长度才可以添加 if(duration>currentPosition+5000) { //当前位置添加五秒钟 player.seekTo(currentPosition+5000); } else { Toast.makeText(MediaDemoActivity.this, "大于总长度了", Toast.LENGTH_SHORT).show(); } }private void backPlay() {
//回退5秒钟 //先获取当前播放的位置 int currentPosition=player.getCurrentPosition(); //当前位置减少五秒钟小于0 if(currentPosition-5000>0) { //当前位置减少五秒钟 player.seekTo(currentPosition - 5000); } else { Toast.makeText(MediaDemoActivity.this, "小于0秒钟", Toast.LENGTH_SHORT).show(); } }@Override
public void onClick(View v) { //给三个按钮添加点击事件 switch (v.getId()) { case R.id.back: backPlay(); break; case R.id.play: play(); break; case R.id.to: toPlay(); break; } }部分布局代码:
<EditText
android:id="@+id/music" android:visibility="gone" android:textSize="18sp" android:textColor="@android:color/black" android:text="http://yinyueshiting.baidu.com/data2/music/238976199/238976199.mp3?xcode=e33e916dd8159c6523407a79428c3f0f" android:layout_width="match_parent" android:layout_height="wrap_content" />//滚动条布局
<SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" />//播放界面布局
<LinearLayout android:layout_below="@+id/seekBar" android:layout_marginTop="20dp" android:orientation="horizontal" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageButton android:id="@+id/back" android:src="@mipmap/a8v" android:background="@null" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageButton android:id="@+id/play" android:src="@mipmap/a8q" android:background="@null" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageButton android:id="@+id/to" android:src="@mipmap/a8m" android:background="@null" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
希望对大家能有所帮助!