android 如何实现 边录音 同时显示 歌词评分?有原理,代码就好了。。_百...

发布网友 发布时间:2024-10-23 22:17

我来回答

3个回答

热心网友 时间:2024-11-06 03:46

这没办法

热心网友 时间:2024-11-06 03:45

歌曲播放时歌词同步显示,我们需要读取以上歌词文件的每一行转换成成一个个歌词实体,可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词
  我们需要读取以上歌词文件的每一行转换成成一个个歌词实体:
   代码如下:

  public class LyricObject {
  public int begintime; // 开始时间
  public int endtime; // 结束时间
  public int timeline; // 单句歌词用时
  public String lrc; // 单句歌词
  }

  可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词。在UI线程中另起线程,通过回调函数 onDraw() 每隔100ms重新绘制屏幕,实现歌词平滑滚动的动画效果。MainActivity代码如下:
   代码如下:

  import java.io.IOException;
  import android.app.Activity;
  import android.media.MediaPlayer;
  import android.net.Uri;
  import android.os.Bundle;
  import android.os.Environment;
  import android.os.Handler;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.SeekBar;
  import android.widget.SeekBar.OnSeekBarChangeListener;
  public class MainActivity extends Activity {
  /** Called when the activity is first created. */
  private LyricView lyricView;
  private MediaPlayer mediaPlayer;
  private Button button;
  private SeekBar seekBar;
  private String mp3Path;
  private int INTERVAL=45;//歌词每行的间隔
  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  setContentView(R.layout.main);
  mp3Path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/LyricSync/1.mp3";
  lyricView = (LyricView) findViewById(R.id.mylrc);
  mediaPlayer = new MediaPlayer();
  // this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  ResetMusic(mp3Path);
  SerchLrc();
  lyricView.SetTextSize();
  button = (Button) findViewById(R.id.button);
  button.setText("播放");
  seekBar = (SeekBar) findViewById(R.id.seekbarmusic);
  seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {
  // TODO Auto-generated method stub
  }
  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {
  // TODO Auto-generated method stub
  }
  @Override
  public void onProgressChanged(SeekBar seekBar, int progress,
  boolean fromUser) {
  // TODO Auto-generated method stub
  if (fromUser) {
  mediaPlayer.seekTo(progress);
  lyricView.setOffsetY(220 - lyricView.SelectIndex(progress)
  * (lyricView.getSIZEWORD() + INTERVAL-1));
  }
  }
  });
  button.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  if (mediaPlayer.isPlaying()) {
  button.setText("播放");
  mediaPlayer.pause();
  } else {
  button.setText("暂停");
  mediaPlayer.start();
  lyricView.setOffsetY(220 - lyricView.SelectIndex(mediaPlayer.getCurrentPosition())
  * (lyricView.getSIZEWORD() + INTERVAL-1));
  }
  }
  });
  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  @Override
  public void onCompletion(MediaPlayer mp) {
  ResetMusic(mp3Path);
  lyricView.SetTextSize();
  lyricView.setOffsetY(200);
  mediaPlayer.start();
  }
  });
  seekBar.setMax(mediaPlayer.getDuration());
  new Thread(new runable()).start();
  }
  public void SerchLrc() {
  String lrc = mp3Path;
  lrc = lrc.substring(0, lrc.length() - 4).trim() + ".lrc".trim();
  LyricView.read(lrc);
  lyricView.SetTextSize();
  lyricView.setOffsetY(350);
  }
  public void ResetMusic(String path) {
  mediaPlayer.reset();
  try {
  mediaPlayer.setDataSource(mp3Path);
  mediaPlayer.prepare();
  } catch (IllegalArgumentException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } catch (IllegalStateException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  }
  class runable implements Runnable {
  @Override
  public void run() {
  // TODO Auto-generated method stub
  while (true) {
  try {
  Thread.sleep(100);
  if (mediaPlayer.isPlaying()) {
  lyricView.setOffsetY(lyricView.getOffsetY() - lyricView.SpeedLrc());
  lyricView.SelectIndex(mediaPlayer.getCurrentPosition());
  seekBar.setProgress(mediaPlayer.getCurrentPosition());
  mHandler.post(mUpdateResults);
  }
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  }
  }
  }
  Handler mHandler = new Handler();
  Runnable mUpdateResults = new Runnable() {
  public void run() {
  lyricView.invalidate(); // 更新视图
  }
  };
  }

热心网友 时间:2024-11-06 03:41

应该下载什么呀
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com