东北大学秦皇岛分校毕业设计(论文)
Handler mHandler = new Handler(); // 歌词滚动线程
Runnable mRunnable = new Runnable() {
@Override public void run() { } };
// TODO Auto-generated method stub
C_MusicPlayerActivity.lrc_view.SetIndex(LrcIndex()); C_MusicPlayerActivity.lrc_view.invalidate(); mHandler.postDelayed(mRunnable, 100);
第 30 页
Android的线程的开始是通过Handler类来进行的,Handler类是线程与线程之间通信的桥梁,实现Runnable接口会实现里面的run方法,当线程开始的时候,Runnable中的run方法会向Handler发一个Message消息,这样,Handler类就可以接收到run方法发送过来的不同的消息进行不同的代码处理。这样就达到了各线程之间的通信。要启动一个线程调用Handler的方法postDelayed(Runnable,1000)表示线程睡眠时间是1000ms 。
以上代码意思是让播放歌曲的线程每隔1000ms,即每1秒对音轨的TextView重新设置时间且让进度条前进1秒的进度。对音轨进行刷新。这样就实现了歌词同步功能SeekBar有一个监听器,该监听器的作用是一直保持着对进度条的监听,当我们用鼠标向SeekBar的各位置进行点击时,它会自动监听其位置,进行相应的位置显示。这也是进度条上的游标会不停的移动和歌词时间会不停的变动的原因。 拖动SeekBar事件:
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekBar) { }
public void onStartTrackingTouch(SeekBar seekBar) { }
// TODO Auto-generated method stub // TODO Auto-generated method stub
东北大学秦皇岛分校毕业设计(论文)
});
public void onProgressChanged(SeekBar seekBar, int progress, }
boolean fromUser) {
第 31 页
// TODO Auto-generated method stub
// 判断用户是否触拖SeekBar并且不为空才执行 if (fromUser && ControlPlay.myMediaPlayer != null) { }
time_left.setText(Music_infoAdapter.toTime(progress));
ControlPlay.myMediaPlayer.seekTo(progress);
4.2.2 播放调节功能实现
各按钮水平放置,从左到右依次是上一首、播放、下一首功能按钮。用的是布局
中的线性布局LinearLayout,;将其设置为水平,如图4.4所示。
图4.4 播放功能按钮
LinearLayout中依次放置播放/暂停,上一首、下一首按钮属性。配置文件代码结构如下: android:orientation=\ android:layout_width=\ android:layout_height=\ android:layout_alignParentBottom=\>
主要按钮功能实现代码:
东北大学秦皇岛分校毕业设计(论文)
(1) “上一首”按钮并实现功能
第 32 页
left_ImageButton.setOnClickListener(new ImageButton.OnClickListener() { });
@Override
public void onClick(View v) { }
// TODO Auto-generated method stub
Intent play_left = new Intent(C_MusicPlayerActivity.this,
ControlPlay.class);
play_left.putExtra(\, \); startService(play_left);
(2) “播放”按钮并实现功能
play_ImageButton.setOnClickListener(new ImageButton.OnClickListener() { });
public void onClick(View v) { }
// TODO Auto-generated method stub
Intent play_center = new Intent(C_MusicPlayerActivity.this,
ControlPlay.class);
play_center.putExtra(\, \); startService(play_center);
(3) “下一首”并实现功能
right_ImageButton.setOnClickListener(new ImageButton.OnClickListener() {
public void onClick(View v) { }
Intent play_right = new Intent(C_MusicPlayerActivity.this,
ControlPlay.class);
play_right.putExtra(\, \); startService(play_right);
东北大学秦皇岛分校毕业设计(论文)
}
});
第 33 页
Android的媒体播放原理:Android源程序已经为我们封装好了一个接口类,叫MediaPlayer。该接口在执行行需要一个数据源,通过如下四个步骤: 第一步:MediaPlayer.reset();复位操作,为以后的媒体准备播放作准备。 第二步: 传入歌曲数据源,这里也是一个数据MediaPlayer.setDataSource(String path);参数需要传一个路径,该接口类在收到路径后将其转化为数据源。 第三步:准备播放数据源,调用方法MediaPlayer.Prepare()。
第四步:MediaPlayer.Start();播放数据源,该数据源播放后,不再与程序 有关,需要用MediaPlayer.Stop()方法让其停止或MediaPlayer.Start();让其启动。 4.3 退出界面
退出程序界面,如图4.5,这个主要是实现退出程序功能,用户如果想退出程序,按下手机返回,选择是否退出程序。
图4.5 退出程序界面 是否退出程序主要代码:
public boolean onKeyDown(int keyCode, KeyEvent event) {
东北大学秦皇岛分校毕业设计(论文)
}
if (keyCode == KeyEvent.KEYCODE_BACK) { }
return super.onKeyDown(keyCode, event);
第 34 页
Dialog dialog = new MyDialog(C_MusicPlayerActivity.this,R.style.MyDialog); dialog.setCanceledOnTouchOutside(true); dialog.show();
4.3 歌词显示界面
当播放音乐文件时,如果同时存在该歌曲的LRC格式的歌词文件时,系统会自动匹配歌词并且达到同步显示的效果,如图4.4所示。
图4.4歌词显示 4.3.1 歌词显示模块
歌词同步显示代码如下: