android:
id="@+id/result"
android:
layout_width="match_parent"
android:
layout_height="wrap_content"
android:
text="当前选择的值为:
50"/>
也可以加入监听功能。
publicclassMainActivityextendsActivity{
privateSeekBarseekbar;
privateTextViewresult;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
Globals.init(this);
//设置所使用的布局界面
setContentView(R.layout.activity_main);
seekbar=(SeekBar)findViewById(R.id.seekbar);
result=(TextView)findViewById(R.id.result);
seekbar.setOnSeekBarChangeListener(newOnSeekBarChangeListener(){
@Override
publicvoidonStopTrackingTouch(SeekBarseekBar){
result.setText("停止拖动");
}
@Override
publicvoidonStartTrackingTouch(SeekBarseekBar){
result.setText("开始拖动");
}
@Override
publicvoidonProgressChanged(SeekBarseekBar,intprogress,
booleanfromUser){
result.setText("正在拖动,当前的值为:
"+progress);
}
});
}
}
3.3、音乐播放器(掌握)
在进行音频和视频播放时,都需要使用MediaPlayer类来加载音频或视频文件。
同时要注意,如果想使用模拟器播放音频时,不能使用snapshot。
同时还要注意,如果使用win7+模拟器播放音频时,必须使用管理员身份启动Eclipse,否则SD卡无法识别。
准备工作都完成后,可以开始初始化音频播放的类,MediaPlayer这个类也有自己的生命周期。
可以通过其API文档来查看生命周期的执行流程:
1)建立对象后,MediaPlayer对象会默认处于空闲状态(idle)
2)需要为其设置播放的数据来源(音频或视频文件)
3)调用prepare()方法,将里面的一些信息读入并准备好。
4)准备好后,才可以调用start()进行播放
5)如果设置了循环播放(looping=true)且歌曲已经播放完成,则会自动重新播放。
6)在播放状态下,调用pause()方法会进入暂停状态,再次调用start()即可继续播放。
7)如果没有设置循环播放(Looping=false),且音乐播放完成,会自动进入播放完成状态,这时如果再次调用start(),则会重新开始当前歌曲的播放。
8)停止状态不会自动进入,必须调用stop方法才会进入这个状态。
9)如果想完整的释放所有内存,需要调用release()方法来完成。
这里先完成一个基本的歌曲播放功能,没有界面。
publicclassMainActivityextendsActivity{
privateMediaPlayerplayer;
privateStringfilePath="/mnt/sdcard/a.mp3";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
player=newMediaPlayer();
try{
//设置要播放的文件
player.setDataSource(filePath);
//进行准备操作
player.prepare();
//开始播放
player.start();
}catch(Exceptione){
e.printStackTrace();
Toast.makeText(this,"当前加载的音乐有问题,请确定文件格式是否正确!
",Toast.LENGTH_LONG)
.show();
}
}
@Override
protectedvoidonDestroy(){
//退出时释放音乐
if(player!
=null){
if(player.isPlaying()){
player.stop();
}
player.release();
}
super.onDestroy();
}
}
设计界面,加入播放,暂停,上一首,下一首,以及所有歌曲列表等界面组件。
android="
xmlns:
tools="
android:
layout_width="match_parent"
android:
layout_height="match_parent"
android:
background="#cccccc"
android:
orientation="vertical">
android:
id="@+id/music_name"
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="1"
android:
gravity="center"
android:
text="@string/hello_world"
android:
textColor="#000000"
android:
textSize="16sp"/>
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="2"
android:
orientation="horizontal">
android:
layout_width="0dp"
android:
layout_height="match_parent"
android:
layout_weight="1"/>
android:
layout_width="0dp"
android:
layout_height="match_parent"
android:
layout_weight="1"
android:
background="@drawable/audio_identify_start_default"/>
android:
layout_width="0dp"
android:
layout_height="match_parent"
android:
layout_weight="1"/>
android:
id="@+id/list"
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="3">
android:
id="@+id/seekbar"
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="0.5"/>
android:
id="@+id/time_text"
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="0.5"
android:
gravity="center"
android:
text="00:
00/00:
00"
android:
textColor="#000000"
android:
textSize="12sp"/>
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="1"
android:
gravity="center"/>
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="1"
android:
orientation="horizontal">
android:
layout_width="0dp"
android:
layout_height="match_parent"
android:
layout_weight="0.5"/>
完成各种音乐播放的操作功能。
publicclassMainActivityextendsActivity{
privateMediaPlayerplayer;
privateStringfilePath="/mnt/sdcard/a.mp3";
privateStringsongName="FlyMeToTheMoon";
//音乐名称
privateTextViewmusicName;
//播放时间长度的文本
privateTextViewtimeText;
//拖动条
privateSeekBarseekbar;
//播放/暂停按钮
privateButtonplayBtn;
//上一首
privateButtonpreBtn;
//下一首
privateButtonnextBtn;
//总播放时长的文本
privateStringdurationTimeStr;
//建立消息通道,以便在子线程中修改界面
privateHandlerhandler;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
seekbar.setProgress(player.getCurrentPosition());
timeText.setText(getTextByMs(player.getCurrentPosition())+"/"
+durationTimeStr);
}
};
//取得所有组件
musicName=(TextView)findViewById(R.id.music_name);
timeText=(TextView)findViewById(R.id.time_text);
seekbar=(SeekBar)findViewById(R.id.seekbar);
playBtn=(Button)findViewById(R.id.play_btn);
preBtn=(Button)findViewById(R.id.pre_btn);
nextBtn=(Button)findViewById(R.id.next_btn);
//初始化
player=newMediaPlayer();
try{
//设置要播放的文件
player.setDataSource(filePath);
//进行准备操作
player.prepare();
//player.start();
//初始化拖动条的总长度
seekbar.setMax(player.getDuration());
durationTimeStr=getTextByMs(player.getDuration());
//修改歌曲标题
musicName.setText(songName);
//设置显示的播放时间
timeText.setText("00:
00/"+durationTimeStr);
}catch(Exceptione){
e.printStackTrace();
Toast.makeText(this,"当前加载的音乐有问题,请确定文件格式是否正确!
",Toast.LENGTH_LONG)
.show();
}
//加入一个多线程,通过子线程控制拖动条以及显示时间的改变
Threadt=newThread(){
@Override
publicvoidrun(){
while(true){
try{
Thread.sleep(1000);
//取得当前的播放时间位置,设置到拖动条里
if(player.isPlaying()){
//传递一个空消息,不需要有具体的消息内容,因为消息通道中只有一个固定的操作,而且不需要参数.
handler.sendEmptyMessage(0);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
};
t.start();
//为播放按钮加监听
playBtn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
if(player.isPlaying()){
player.pause();
playBtn.setBackgroundResource(R.drawable.ic_player_play_default);
}else{
player.start();
playBtn.setBackgroundResource(R.drawable.ic_player_pause_default);
}
}
});
//开始播放
playBtn.performClick();
//加入拖动条的监听
seekbar.setOnSeekBarChangeListener(newOnSeekBarChangeListener(){
@Override
publicvoidonStopTrackingTouch(SeekBarseekBar){
//