Android 音乐播放器实现歌词显示

Android 音乐播放器实现歌词显示

LrcHandle.java:

package com.example.welcome;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/***
 * 获取时间以及对应的歌词
 *
 * @author chao
 *
 */
public class LrcHandle {
 private List<String> mWords = new ArrayList<String>();
 private List<Integer> mTimeList = new ArrayList<Integer>();

// 处理歌词文件
 public void readLRC(String path) {
  File file = new File(path);

try {
   FileInputStream fileInputStream = new FileInputStream(file);
   InputStreamReader inputStreamReader = new InputStreamReader(
     fileInputStream, "GBK");
   BufferedReader bufferedReader = new BufferedReader(
     inputStreamReader);
   String s = "";
   while ((s = bufferedReader.readLine()) != null) {
    addTimeToList(s);
    if ((s.indexOf("[ar:") != -1) || (s.indexOf("[ti:") != -1)
      || (s.indexOf("[by:") != -1)) {
     s = s.substring(s.indexOf(":") + 1, s.indexOf("]"));
    } else {
     // ss为时间 [02:12.22]
     String ss = s.substring(s.indexOf("["), s.indexOf("]") + 1);
     // s为ss时间后的歌词
     s = s.replace(ss, "");
    }
    mWords.add(s);
   }

bufferedReader.close();
   inputStreamReader.close();
   fileInputStream.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
   mWords.add("没有歌词文件,赶紧去下载");
  } catch (IOException e) {
   e.printStackTrace();
   mWords.add("没有读取到歌词");
  }
 }

public List<String> getWords() {
  return mWords;
 }

public List<Integer> getTime() {
  return mTimeList;
 }

// 分离出时间
 private int timeHandler(String string) {
  string = string.replace(".", ":");
  String timeData[] = string.split(":");
  // 分离出分、秒并转换为整型
  int minute = Integer.parseInt(timeData[0]);
  int second = Integer.parseInt(timeData[1]);
  int millisecond = Integer.parseInt(timeData[2]);

// 计算上一行与下一行的时间转换为毫秒数
  int currentTime = (minute * 60 + second) * 1000 + millisecond * 10;

return currentTime;
 }

private void addTimeToList(String string) {
  Matcher matcher = Pattern.compile(
    "\\[\\d{1,2}:\\d{1,2}([\\.:]\\d{1,2})?\\]").matcher(string);
  if (matcher.find()) {
   String str = matcher.group();
   mTimeList.add(new LrcHandle().timeHandler(str.substring(1,
     str.length() - 1)));
  }
 }
}

WordView.java:

package com.example.welcome;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class WordView extends TextView {
 private List mWordsList = new ArrayList();
 private Paint mLoseFocusPaint;
 private Paint mOnFocusePaint;
 private float mX = 0;
 private float mMiddleY = 0;
 private float mY = 0;
 private static final int DY = 50;
 private int mIndex = 0;

public WordView(Context context) throws IOException {
  super(context);
  init();
 }

public WordView(Context context, AttributeSet attrs) throws IOException {
  super(context, attrs);
  init();
 }

public WordView(Context context, AttributeSet attrs, int defStyle)
   throws IOException {
  super(context, attrs, defStyle);
  init();
 }

@Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);

canvas.drawColor(Color.BLACK);
  Paint p = mLoseFocusPaint;
  p.setTextAlign(Paint.Align.CENTER);
  Paint p2 = mOnFocusePaint;
  p2.setTextAlign(Paint.Align.CENTER);

canvas.drawText((String) mWordsList.get(mIndex), mX, mMiddleY, p2);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c53efd41d462e19ab57e1a317c99fb62.html