package com.music.lyricsync;
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.Iterator;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class LyricView extends View{
private static TreeMap<Integer, LyricObject> lrc_map;
private float mX; //屏幕X轴的中点,此值固定,保持歌词在X中间显示
private float offsetY; //歌词在Y轴上的偏移量,此值会根据歌词的滚动变小
private static boolean blLrc=false;
private float touchY; //当触摸歌词View时,保存为当前触点的Y轴坐标
private float touchX;
private boolean blScrollView=false;
private int lrcIndex=0; //保存歌词TreeMap的下标
private int SIZEWORD=0;//显示歌词文字的大小值
private int INTERVAL=45;//歌词每行的间隔
Paint paint=new Paint();//画笔,用于画不是高亮的歌词
Paint paintHL=new Paint(); //画笔,用于画高亮的歌词,即当前唱到这句歌词
public LyricView(Context context){
super(context);
init();
}
public LyricView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
/* (non-Javadoc)
* @see android.view.View#onDraw(android.graphics.Canvas)
*/
@Override
protected void onDraw(Canvas canvas) {
if(blLrc){
paintHL.setTextSize(SIZEWORD);
paint.setTextSize(SIZEWORD);
LyricObject temp=lrc_map.get(lrcIndex);
canvas.drawText(temp.lrc, mX, offsetY+(SIZEWORD+INTERVAL)*lrcIndex, paintHL);
// 画当前歌词之前的歌词
for(int i=lrcIndex-1;i>=0;i--){
temp=lrc_map.get(i);
if(offsetY+(SIZEWORD+INTERVAL)*i<0){
break;
}
canvas.drawText(temp.lrc, mX, offsetY+(SIZEWORD+INTERVAL)*i, paint);
}
// 画当前歌词之后的歌词
for(int i=lrcIndex+1;i<lrc_map.size();i++){
temp=lrc_map.get(i);
if(offsetY+(SIZEWORD+INTERVAL)*i>600){
break;
}
canvas.drawText(temp.lrc, mX, offsetY+(SIZEWORD+INTERVAL)*i, paint);
}
}
else{
paint.setTextSize(25);
canvas.drawText("找不到歌词", mX, 310, paint);
}
super.onDraw(canvas);
}
/* (non-Javadoc)
* @see android.view.View#onTouchEvent(android.view.MotionEvent)
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
System.out.println("bllll==="+blScrollView);
float tt=event.getY();
if(!blLrc){
//return super.onTouchEvent(event);
return super.onTouchEvent(event);
}
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
touchX=event.getX();
break;
case MotionEvent.ACTION_MOVE:
touchY=tt-touchY;
offsetY=offsetY+touchY;
break;
case MotionEvent.ACTION_UP:
blScrollView=false;
break;
}
touchY=tt;
return true;
}
public void init(){
lrc_map = new TreeMap<Integer, LyricObject>();
offsetY=320;
paint=new Paint();
paint.setTextAlign(Paint.Align.CENTER);
paint.setColor(Color.parseColor("#483d8b"));
paint.setAntiAlias(true);
paint.setDither(true);
paint.setAlpha(180);
paintHL=new Paint();
paintHL.setTextAlign(Paint.Align.CENTER);
paintHL.setColor(Color.GREEN);
paintHL.setAntiAlias(true);
paintHL.setAlpha(255);
}
/**
* 根据歌词里面最长的那句来确定歌词字体的大小
*/
public void SetTextSize(){
if(!blLrc){
return;
}
int max=lrc_map.get(0).lrc.length();
for(int i=1;i<lrc_map.size();i++){
LyricObject lrcStrLength=lrc_map.get(i);
if(max<lrcStrLength.lrc.length()){
max=lrcStrLength.lrc.length();
}
}
SIZEWORD=18;
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mX = w * 0.5f;
super.onSizeChanged(w, h, oldw, oldh);
}
/**
* 歌词滚动的速度
*
* @return 返回歌词滚动的速度
*/
public Float SpeedLrc(){
float speed=0;
if(offsetY+(SIZEWORD+INTERVAL)*lrcIndex>220){
speed=((offsetY+(SIZEWORD+INTERVAL)*lrcIndex-220)/20);
} else if(offsetY+(SIZEWORD+INTERVAL)*lrcIndex < 120){
Log.i("speed", "speed is too fast!!!");
speed = 0;
}
// if(speed<0.2){
// speed=0.2f;
// }
return speed;
}
/**
* 按当前的歌曲的播放时间,从歌词里面获得那一句
* @param time 当前歌曲的播放时间
* @return 返回当前歌词的索引值
*/
public int SelectIndex(int time){
if(!blLrc){
return 0;
}
int index=0;
for(int i=0;i<lrc_map.size();i++){
LyricObject temp=lrc_map.get(i);
if(temp.begintime<time){
++index;
}
}
lrcIndex=index-1;
if(lrcIndex<0){
lrcIndex=0;
}
return lrcIndex;
}
/**
* 读取歌词文件
* @param file 歌词的路径
*
*/
public static void read(String file) {
TreeMap<Integer, LyricObject> lrc_read =new TreeMap<Integer, LyricObject>();
String data = "";
try {
File saveFile=new File(file);
// System.out.println("是否有歌词文件"+saveFile.isFile());
if(!saveFile.isFile()){
blLrc=false;
return;
}
blLrc=true;
//System.out.println("bllrc==="+blLrc);
FileInputStream stream = new FileInputStream(saveFile);// context.openFileInput(file);
BufferedReader br = new BufferedReader(new InputStreamReader(stream,"GB2312"));
int i = 0;
Pattern pattern = Pattern.compile("\\d{2}");
while ((data = br.readLine()) != null) {
// System.out.println("++++++++++++>>"+data);
data = data.replace("[","");//将前面的替换成后面的
data = data.replace("]","@");
String splitdata[] =data.split("@");//分隔
if(data.endsWith("@")){
for(int k=0;k<splitdata.length;k++){
String str=splitdata[k];
str = str.replace(":",".");
str = str.replace(".","@");
String timedata[] =str.split("@");
Matcher matcher = pattern.matcher(timedata[0]);
if(timedata.length==3 && matcher.matches()){
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
MyMusic.rar (38个子文件)
MyMusic
bin
classes.dex 15KB
res
drawable-ldpi
ic_launcher.png 19KB
drawable-hdpi
ic_launcher.png 19KB
drawable-mdpi
logo.png 9KB
classes
com
music
lyricsync
MainActivity.class 4KB
MainActivity$3.class 2KB
MainActivity$2.class 2KB
MainActivity$1.class 767B
R$layout.class 397B
R$id.class 485B
R$drawable.class 465B
R$attr.class 343B
R.class 585B
MainActivity$4.class 1KB
LyricObject.class 394B
MainActivity$runable.class 2KB
R$string.class 430B
LyricView.class 8KB
R$anim.class 430B
resources.ap_ 175KB
MyMusic.apk 185KB
res
drawable-ldpi
ic_launcher.png 4KB
drawable-hdpi
ic_launcher.png 4KB
values
strings.xml 182B
drawable-mdpi
psb.jpg 124KB
logo.png 13KB
anim
gradually2.xsd 230B
gradually.xml 230B
layout
main.xml 1KB
assets
gen
com
music
lyricsync
R.java 1KB
proguard.cfg 1KB
src
com
music
lyricsync
MainActivity.java 4KB
LyricObject.java 222B
LyricView.java 12KB
.project 843B
.classpath 364B
project.properties 360B
AndroidManifest.xml 800B
共 38 条
- 1
Hmg-L
- 粉丝: 22
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页