MediaPlayer 음악 재생기 진행률 막대

오늘은 MediaPlayer를 사용하여 음악을 재생할 때 진도표를 추가하는 것을 연구했습니다. 진도표는 현재android가 자체로 가지고 있는 seekbar를 사용하고 후기에 UI를 바꿉니다. 이전에 음악을 재생할 수 있었던 토대에서 현재 추가된 주요 기능은 두 가지가 있습니다.
1 실시간으로 진행 상태 표시
2 재생 속도 수동 조절
현재 학습 슬래그는 새로운 프로젝트를 만들어 테스트를 진행하고 있으며, 후기에는 이전 블로그에서 소개한 슬라이딩 페이지와 통합할 것입니다. 서비스가 구축된 후에 통합될 것으로 예상됩니다. 기대해 주십시오...
자, 먼저 효과도 올리기:
진행률 막대 사용에 대한 기본 원리는 간단합니다.
1곡의 시간: 단위는 밀리초, 미디어플레이어의 getDuration()이지만 getDuration()의 사용 상태에 주의해야 한다. 이 블로그에서 미디어플레이어의 각 상태를 소개했으니 여러분이 보실 수 있다.
2 진도표의 길이:android에서 진도표의 길이는 기본적으로 100이어야 하며 단위가 불분명하여 영향을 주지 않습니다
3 현재 진도: 노래의 경우 현재 진도는 현재 재생된 노래가 있는 위치이고 단위는 밀리초이며 진도표의 경우 진도표에서 차지하는 비율이다.주로 이 두 가지를 전환시킨다.
두 가지 기능:
1 진도가 실시간으로 업데이트되어야 하기 때문에 시스템에서 하나의 라인으로 UI 라인에 메시지를 보내고(100밀리초 간격으로) UI 라인에서handler로 메시지를 포착하여 미디어플레이어의 getcurrentPosition을 통해 현재 위치를 얻어서seekbar에 대응하는 위치를 계산하여seekbar에 대한 업데이트를 제때에 진행한다.
2 수동으로 곡의 진도를 조절할 때 조절된 위치를 획득하여 SeekBar를 통해 조절한다.원섹바체인지 리스터()는 슬라이더를 감청하고, 슬라이더 조절 위치가 정해지면 온스톱트래킹 터치(onStopTrackingTouch)를 통해 곡의 진도를 제때 업데이트하고, 미디어플레이어의 seekTo(단위는 밀리초)로 곡의 진도를 조절한다.
구체적인 코드는 다음과 같습니다.
[java] view plain copy CODE에서 코드 슬라이스를 보고 내 코드 슬라이스 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 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 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; }
}

좋은 웹페이지 즐겨찾기