效果图
布局文件
好像还有点小清新???
布局文件
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人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦