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);
