android lrc歌词显示

  歌词双行交叉显示,代码不完善,兼容性差,还有待改进,进入正文:

以下为旧版代码,新版lrc解析代码已经写完,全面修复兼容性,请直接参考:http://www.qylk.blog.163.com/blog/static/134687356201162023117621/

先定义一个存放每句歌词的类,它定义了每句歌词的起始时间,持续时间,及每句歌词正文,相当于C语言的结构体。

public class LRCbean {
 private int beginTime=0;
 public int getBeginTime() {
  return beginTime;

 private int  lineTime=0;
 private String lrcBody = null;
 }
 public void setBeginTime(int beginTime) {
  this.beginTime = beginTime;
 }
 public int getLineTime() {
  return lineTime;
 }
 public void setLineTime(int lineTime) {
  this.lineTime = lineTime;
 }
 public String getLrcBody() {
  return lrcBody;
 }
 public void setLrcBody(String lrcBody) {
  this.lrcBody = lrcBody;
 }
}

 


歌词解析类如下:

public class LrcUtils {
 private  TreeMap<Integer, LRCbean> read(File path){//读取歌词
  TreeMap<Integer, LRCbean> lrc_read = new TreeMap<Integer, LRCbean>();//临时表
     String data =null;
     BufferedReader br = null;
     FileInputStream stream = null;
  try {
   stream = new FileInputStream(path);//读入歌词文件流
            br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));//向内存写入
  } catch (Exception e) {}
  try {
   while((data=br.readLine())!=null){//逐行读取
    if (data.length()>6){//此行有歌词
     if (data.charAt(3)==':'&&data.charAt(6)=='.'){//从歌词正文开始
      data = data.replace("[", "");
      data = data.replace("]", "@");
      data = data.replace(".", ":");
      String lrc[] = data.split("@");//将时间与歌词分开
      String lrcContent= null;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android Studio中显示LRC歌词文件,可以按照以下步骤进行操作: 1.在布局文件中添加一个TextView,用于显示歌词。 2.在Java代码中读取LRC文件并将其解析为Map,其中键为时间戳,值为歌词文本。 3.在MediaPlayer的OnPreparedListener中启动一个线程,该线程将定期更新TextView以显示当前播放时间的歌词。 下面是一个简单的示例代码,可以帮助你实现这个功能: ```java // 在布局文件中添加一个TextView,用于显示歌词 TextView lrcTextView = findViewById(R.id.lrcTextView); // 在Java代码中读取LRC文件并将其解析为Map Map<Long, String> lrcMap = new HashMap<>(); try { BufferedReader br = new BufferedReader(new FileReader(lrcFile)); String line; while ((line = br.readLine()) ! null) { Matcher matcher = Pattern.compile("\\[(\\d{2}):(\\d{2})\\.(\\d{2})\\](.*)").matcher(line); if (matcher.find()) { long time = Long.parseLong(matcher.group(1)) * 60 * 1000 + Long.parseLong(matcher.group(2)) * 1000 + Long.parseLong(matcher.group(3)) * 10; String text = matcher.group(4); lrcMap.put(time, text); } } br.close(); } catch (IOException e) { e.printStackTrace(); } // 在MediaPlayer的OnPreparedListener中启动一个线程,该线程将定期更新TextView以显示当前播放时间的歌词 MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { new Thread(new Runnable() { @Override public void run() { while (mediaPlayer.isPlaying()) { long time = mediaPlayer.getCurrentPosition(); if (lrcMap.containsKey(time)) { runOnUiThread(new Runnable() { @Override public void run() { lrcTextView.setText(lrcMap.get(time)); } }); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }); // 播放音乐 mediaPlayer.setDataSource(audioFile); mediaPlayer.prepare(); mediaPlayer.start(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值