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;
    	}
    
    }
  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4274142.html
Copyright © 2011-2022 走看看