效果图
布局文件
好像还有点小清新???
布局文件
MediaPlayer的使用
/**
* 初始化播放器MediaPlayer
*/private void initMediaPlayer() { //1. 加载选中歌曲
try { //1.1 设置音频文件路径, 或者是资源uri
if (mType == 1) {
mediaPlayer.setDataSource(mFilePath);
} else if (mType == 2) {
Uri uri = Uri.parse("android.resource://com.so.mymusic/" + R.raw.one);
mediaPlayer.setDataSource(this, uri);
} else { return;
}
//1.2 设置为循环, MediaPlayer预加载
mediaPlayer.setLooping(true);
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}/**
* @param v 使用资源文件中的音乐
*/public void addMusic(View v) {
mRawMusic = "R.raw.one";
et_input_path.setText(mRawMusic); //2. 初始化播放器
mType = 2;
initMediaPlayer();
}public void setDataSource(Context context, Uri uri);
public void setDataSource(String path);
你可以使用setDataSource来加载uri定位的文件, 也可以传入文件系统中的路径path来加载, 示例就是这么分的. 在这之后一定要记得调用prepare方法去预装文件.
/**
* @param v 播放按钮
*/public void playMusic(View v) { //1. 获取文件的持续时间
sb_progress.setMax(mediaPlayer.getDuration());
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
}/**
* @param v 暂停按钮
*/public void pauseMusic(View v) { if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}/**
* @param v 停止按钮
*/public void stopMusic(View v) { if (mediaPlayer.isPlaying()) {
mediaPlayer.reset();
initMediaPlayer();
}
}这是三个按钮对应的点击方法, 要记得在播放前获取音乐文件的总时长, 并设置给进度条.
读取文件系统肯定是要权限的, 可以查看我之前的文章一个Util带你获取Android6.0以上的读写sdcard权限
进度条的设置
/**
* 初始化进度条
*/private void initSeekBar() { //1. 设置进度条监听
isSeek = false;
sb_progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isSeek = true;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(seekBar.getProgress());
isSeek = false;
}
});
//2. 开启线程同步进度条
new Thread() { @Override
public void run() { while (keepTrue) { try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
} if (!isSeek) {
sb_progress.setProgress(mediaPlayer.getCurrentPosition());
}
}
}
}.start();
}setOnSeekBarChangeListener的监听器有三个方法要重写, 除了用isSeek记录状态之外, 停止触摸之后使用MediaPlayer的seekTo方法是重点. 然后就是进度条的绘制肯定是要开新线程的. 有一点就是, 在while循环中, 条件参数不要直接写true, 要设置变量, 否则会警告啥的.
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
