android 播放音乐-进度条

今天学渣研究了一下使用MediaPlayer播放音乐时加入进度条,进度条如今用的是android自带的seekbar,后期会跟换UI的,在之前可以播放音乐的基础上,如今加入的主要功能有两个:

1实时显示播放进度

2手动调节播放进度

如今学渣新建了一个项目来进行測试,后期会和之前博客介绍的滑动页面进行整合,预计会在service建好后整合,敬请期待。。。。

好了先上效果图:

关于使用进度条的基本原理非常easy,用到了几个參数:

1 歌曲的时长:单位为毫秒,MediaPlayer的getDuration(),只是要注意getDuration()的使用状态,在这篇博客中介绍了MediaPlayer的各个状态,大家能够去看看。

2 进度条的长度:android里进度条的长度默认应该是100,单位不详,没影响

3 当前进度:对于歌曲而言,当前进度是当前播放的歌曲所在位置,单位毫秒,对于进度条而言,是在进度条中所占的比例。主要是对这两个进行转化。

两个功能:

1因为进度须要实时更新,因此在系统中用一个线程对UI线程发消息(每隔100毫秒),在UI线程中用Handler捕获消息,通过MediaPlayer的getCurrentPosition得到当前位置,进而计算seekbar相应的位置,对seekbar及时进行更新。

2对于手动调节歌曲进度时,通过获取调节到的位置,通过SeekBar.OnSeekBarChangeListener()监听滑动条,当滑动条调节位置确定后,通过onStopTrackingTouch()及时更新歌曲的进度,用MediaPlayer的seekTo(单位是毫秒)调节歌曲的进度。

详细代码例如以下:

public class MainActivity extends Activity {

	MediaPlayer mediaPlayer;

	SeekBar seekBar;

	//本地歌曲的路径
	String path = "/storage/sdcard1/Music/浪漫满屋.mp3";

	//处理进度条更新
	Handler mHandler = new Handler(){
		@Override
        public void handleMessage(Message msg){
			switch (msg.what){
			case 0:
				//更新进度
				int position = mediaPlayer.getCurrentPosition();  

	            int time = mediaPlayer.getDuration();
	            int max = seekBar.getMax();  

	            seekBar.setProgress(position*max/time);
	            break;
	        default:
	        	break;
			}

        }
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		init();
		//初始化播放button
		Button playButton = (Button)findViewById(R.id.playButton);
		playButton.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "time is "+mediaPlayer.getDuration(), 1000).show();

				play();
			}

		});

		//初始化暂停button
		Button pauseButton = (Button)findViewById(R.id.pauseButton);
		pauseButton.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				pause();
			}
		});

	    seekBar = (SeekBar)findViewById(R.id.seekbar);
		seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

			@Override
			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);
			}

			@Override
			public void onStartTrackingTouch(SeekBar arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
				// TODO Auto-generated method stub

			}
		});

	}
//初始化音乐播放
	void init(){
		//进入Idle
		mediaPlayer = new MediaPlayer();
		try {
			//初始化
			mediaPlayer.setDataSource(path);

			mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  

			// prepare 通过异步的方式装载媒体资源
			mediaPlayer.prepareAsync();

			//后台线程发送消息进行更新进度条
			final int milliseconds = 100;
			new Thread(){
				@Override
				public void run(){
					while(true){
		                try {
		                    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 退出时,停止播放音乐,释放资源
	@Override
	protected void onDestroy() {
	         // 在activity结束的时候回收资源
	         if (mediaPlayer != null && mediaPlayer.isPlaying()) {
	             mediaPlayer.stop();
	             mediaPlayer.release();
	             mediaPlayer = null;
	         }
	         super.onDestroy();
   }
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
时间: 2024-11-21 02:46:57

android 播放音乐-进度条的相关文章

基于Jquery的音乐播放器进度条插件

自己基于豆瓣FM的ui仿写qq音乐时,基于Jquery手写的进度条插件,效果图如下: 主要特色: ① 可自适应挂载元素的宽度,也可以自己设置进度条宽度: ② 支持部分默认参数修改(具体见使用说明): ③ 允许最大时间为23:59:59,高于此值将默认修改为此值: ④ 可以自己控制进度条动画的开关及重置: ⑤ 可以获取进度条当前时间和宽度,与H5的audio标签协调使用. 使用说明: /* * 功能描述:播放器进度条 * 参数: * option:挂载父元素 * inTime:进度条时间长度 *

【转】24. android dialog ——ProgressDialog 进度条对话框详解

原文网址:http://blog.csdn.net/jamesliulyc/article/details/6375598 首先在onCreateDialog方法里创建一个ProgressDialog,如下: [java] view plaincopy //this表示该对话框是针对当前Activity的 progressDialog = new ProgressDialog(this); //设置最大值为100 progressDialog.setMax(100); //设置进度条风格STYL

Android 中带有进度条效果的按钮(Button)

安卓中带有进度条效果的按钮,如下图: 1.布局文件如下activity_main.xml 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="fill_parent" 4 android:layo

[Android]组件之进度条2

这个例子不错,详细讲解了alertdialog及LayoutInflater的用法: main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:lay

Android——菜单和进度条

xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent&quo

android中的进度条

Android中有多种进度条,如转圈的圆环,水平线的进度条.可拉伸的进度条等,各种进度条关系如下 SeekBar是可拉伸的进度条,RatingBar是用于评分的进度条,都属于ProgressBar的子类 ProgressBar有多种风格,如Horizontal.Small.Large.Inverse等 进度条的主要属性 进度条最大值:max 当前进度:progress 次要进度的值:SecondaryProgress progressbar.isIndeterminate(); 用于判断进度条是

android快递跟踪进度条

android 快递跟踪进度条 activity.class import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; public class MainActivity extends

Android View 之进度条+拖动条+星级评论条....

PS:将来的你会感谢现在奋斗的自己.... 学习内容: 1.进度条 2.拖动条 3.星级评论条 1.进度条...       进图条这东西想必大家是很熟悉的...为了使用户不会觉得应用程序死掉了,因此为之设置一个进度条使应用程序的运行状态更好的反馈给客户...这也就是进度条的作用...因此一般的应用程序都会加入进度条...进度条分为圆形进度条和线性的进度条...目的都是一样的,只是展示的效果是不同的...用代码讲解一下... <LinearLayout xmlns:android="htt

Android webview 显示进度条

代码: ProgressDialog dialog = null; /** * 嵌入浏览器 */ private void embedBrowser(String url) { Log.i(TAG, url); WebView browser = (WebView) this.findViewById(R.id.c131_webkit); if (browser != null) { wifi = new WifiService(this); if (wifi.isNetworkConnecte