zoukankan      html  css  js  c++  java
  • 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;
    	}
    
    }
  • 相关阅读:
    maptalks 开发GIS地图(16)maptalks.three.09
    maptalks 开发GIS地图(15)maptalks.three.08
    maptalks 开发GIS地图(14)maptalks.three.07
    maptalks 开发GIS地图(12)maptalks.three.05 bar-music
    Use mongoose-CRUD operations
    First Mongoose Model
    MongoDB-1-CRUD Operations
    Mongo DB-0
    Kill port process
    Defining RESTful Routes(CRUD operations)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4274142.html
Copyright © 2011-2022 走看看