这个视频里的进度25:52后面的微信小程序音乐进度条

2700人阅读
android笔记(7)
今天学渣研究了一下使用MediaPlayer播放音乐时添加进度条,进度条现在用的是android自带的seekbar,后期会跟换UI的,在之前能够播放音乐的基础上,现在添加的主要功能有两个:
1实时显示播放进度
2手动调节播放进度
现在学渣新建了一个项目来进行测试,后期会和之前博客介绍的滑动页面进行整合,估计会在service建好后整合,敬请期待。。。。
好了先上效果图:
关于使用进度条的基本原理很简单,用到了几个参数:
1 歌曲的时长:单位为毫秒,MediaPlayer的getDuration(),不过要注意getDuration()的使用状态,在这篇博客中介绍了MediaPlayer的各个状态,大家可以去看看。
2 进度条的长度:android里进度条的长度默认应该是100,单位不详,没影响
3 当前进度:对于歌曲而言,当前进度是当前播放的歌曲所在位置,单位毫秒,对于进度条而言,是在进度条中所占的比例。主要是对这两个进行转化。
两个功能:
1由于进度需要实时更新,因此在系统中用一个线程对UI线程发消息(每隔100毫秒),在UI线程中用Handler捕获消息,通过MediaPlayer的getCurrentPosition得到当前位置,进而计算seekbar对应的位置,对seekbar及时进行更新。
2对于手动调节歌曲进度时,通过获取调节到的位置,通过SeekBar.OnSeekBarChangeListener()***滑动条,当滑动条调节位置确定后,通过onStopTrackingTouch()及时更新歌曲的进度,用MediaPlayer的seekTo(单位是毫秒)调节歌曲的进度。
具体代码如下:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
public class MainActivity extends Activity {
MediaPlayer mediaP
SeekBar seekB
//本地歌曲的路径
String path = "/storage/sdcard1/Music/浪漫满屋.mp3";
//处理进度条更新
Handler mHandler = new Handler(){
public void handleMessage(Message msg){
switch (msg.what){
//更新进度
int position = mediaPlayer.getCurrentPosition();
int time = mediaPlayer.getDuration();
int max = seekBar.getMax();
seekBar.setProgress(position*max/time);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化播放按钮
Button playButton = (Button)findViewById(R.id.playButton);
playButton.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "time is "+mediaPlayer.getDuration(), 1000).show();
//初始化暂停按钮
Button pauseButton = (Button)findViewById(R.id.pauseButton);
pauseButton.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
// TODO Auto-generated method stub
seekBar = (SeekBar)findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekBar) {
//手动调节进度
// TODO Auto-generated method stub
int dest = seekBar.getProgress();
int time = mediaPlayer.getDuration();
int max = seekBar.getMax();
mediaPlayer.seekTo(time*dest/max);
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
// TODO Auto-generated method stub
//初始化音乐播放
void init(){
//进入Idle
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(path);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// prepare 通过异步的方式装载媒体资源
mediaPlayer.prepareAsync();
//后台线程发送消息进行更新进度条
final int milliseconds = 100;
new Thread(){
public void run(){
while(true){
sleep(milliseconds);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
mHandler.sendEmptyMessage(0);
}.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//测试播放音乐
void play(){
mediaPlayer.start();
//暂停音乐
private void pause() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
//activity 退出时,停止播放音乐,释放资源
protected void onDestroy() {
// 在activity结束的时候回收资源
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
super.onDestroy();
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12561次
排名:千里之外
原创:25篇
(1)(2)(1)(2)(1)(10)(2)(10)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'[非音乐高手勿进!]这个视频中西域风格的纯音乐(25:30开始出现的_纯音乐吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:254,674贴子:
[非音乐高手勿进!]这个视频中西域风格的纯音乐(25:30开始出现的收藏
快试试吧,可以对自己使用挽尊卡咯~◆◆
就是从“张骞出使西域”(25:30左右)开始的那一小段背景音乐,叮叮叮...叮叮叮...的那种抑扬顿挫地很有节奏的西域风格的纯音乐,有高手知道吗?
操作步骤,案例分享,培训资料......你想找的都在这里,海量信息免费查寻!
我承认我手贱。我想直接把兰州拍死。。。。
快试试吧,可以对自己使用挽尊卡咯~◆◆
快试试吧,可以对自己使用挽尊卡咯~◆◆
登录百度帐号推荐应用

参考资料

 

随机推荐