这是我在CSDN的第一篇博客,也是我第一次写博客,当我踏进“码农”的世界的时候,我就要坚持往下走,学习更多的东西,废话不多说,开始进入正题。
由于才开始从入门到进阶的学习阶段,存在有很多不足,希望大家多多指正和建议,最近一直在做一些显示提醒方面的,很多都离不开进度显示,今天做了一个音乐进度的显示,看了API自己发现了一些小东西以便与大家分享交流学习。
1.关于MediaPlayer的API介绍;
方法:create(Context context, Uri uri) 解释:静态方法,通过Uri创建一个多媒体播放器。
方法:create(Context context, int resid) 解释:静态方法,通过资源ID创建一个多媒体播放器
方法:create(Context context, Uri uri, SurfaceHolder holder) 解释:静态方法,通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器
方法: getCurrentPosition() 解释:返回 Int, 得到当前播放位置
方法: getDuration() 解释:返回 Int,得到文件的时间
方法:getVideoHeight() 解释:返回 Int ,得到视频的高度
方法:getVideoWidth() 解释:返回 Int,得到视频的宽度
方法:isLooping() 解释:返回 boolean ,是否循环播放
方法:isPlaying() 解释:返回 boolean,是否正在播放
方法:pause() 解释:无返回值 ,暂停
方法:prepare() 解释:无返回值,准备同步
方法:prepareAsync() 解释:无返回值,准备异步
方法:release() 解释:无返回值,释放 MediaPlayer 对象
方法:reset() 解释:无返回值,重置 MediaPlayer 对象
方法:seekTo(int msec) 解释:无返回值,指定播放的位置(以毫秒为单位的时间)
方法:setAudioStreamType(int streamtype) 解释:无返回值,指定流媒体的类型
方法:setDataSource(String path) 解释:无返回值,设置多媒体数据来源【根据 路径】
方法:setDataSource(FileDescriptor fd, long offset, long length) 解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】
方法:setDataSource(FileDescriptor fd) 解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】
方法:setDataSource(Context context, Uri uri) 解释:无返回值,设置多媒体数据来源【根据 Uri】
方法:setDisplay(SurfaceHolder sh) 解释:无返回值,设置用 SurfaceHolder 来显示多媒体
方法:setLooping(boolean looping) 解释:无返回值,设置是否循环播放
事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 解释:监听事件,网络流媒体的缓冲监听
事件:setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 解释:监听事件,网络流媒体播放结束监听
事件:setOnErrorListener(MediaPlayer.OnErrorListener listener) 解释:监听事件,设置错误信息监听
事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) 解释:监听事件,视频尺寸监听
方法:setScreenOnWhilePlaying(boolean screenOn) 解释:无返回值,设置是否使用 SurfaceHolder 显示
方法:setVolume(float leftVolume, float rightVolume) 解释:无返回值,设置音量
方法:start() 解释:无返回值,开始播放
方法:stop() 解释:无返回值,停止播放
2.MediaPlayer显示播放进度:
原来:(1)音乐定点播放 :MediaPlayer.seekTo();
(2)音乐文件播放时间:MediaPlayer.getDuration();
(3)SeekBar获取位置:MediaPlayer.getProgress();
(4)SeekBar的最大值:MediaPlayer.getMax();
3.实现播放显示进度方法
(1)定点播放最简单的一种方式:
把音乐的总时间设置成进度条的最大值 progressbar,setMax(mPlayer.getDuration());
然后在进度条上拖动位置就可以定到毫秒数 public void onStopTrackingTouch(SeekBar seekBar){
mPlayer.seekTo(progressbar.getProgress());
}
自动加载显示进度的方法也是一样 progressbar.setProgress(mPlayer.getCurrentPosition());
我们可以通过一个公司更能直观的帮助理解{音乐播放当前时间:音乐播放总时间 = = 进度条当前进度:进度条总长度};
建议不要用音乐总长度,因为可能有些大的会超过100,000‘建议用比例的方法来进行拖动,我也进行一些数值类型的处理来降低和避免拖放时声音会有一些回播现象。(我们重点介绍方法二,比例拖放)
定点拖动代码:
seek.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
int dest = seek.getProgress();
int mMax = mPlayer.getDuration();
int sMax = seek.getMax();
mPlayer.seekTo(mMax*dest/sMax);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
(2)比例拖放:
{音乐播放当前时间:音乐播放总时间 = = 进度条当前进度:进度条总长度},由于MediaPlaye没有播放进度的回调函数,所以我们通过一个Thread定时刷新,通过float类型的数据处理以后在转换成int丢给Progress,这样有助于降低噪点。
直接上代码:
public void StartProgress(){
//开辟新的Thread用于定期刷新SeekBar;
DelayThread dThread = new DelayThread(100);
dThread.start();
}
//开启一个线程进行实时刷新
Handler handler = new Handler(){
public void handleMessage(Message msg){
float position = mPlayer.getCurrentPosition();
float mMax = mPlayer.getDuration();
float sMax = seek.getMax();
seek.setProgress((int) (sMax*position/mMax));
}
};
public class DelayThread extends Thread{
int milliseconds;
public DelayThread(int i){
milliseconds=i;
}
public void run(){
while(true){
try {
sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}
}
}
希望对大家有所帮助,谢谢。