lrc歌词解析(正则表达式)与歌词卡拉ok显示的思路
来源:互联网 发布:电源检测软件 编辑:程序博客网 时间:2024/05/01 06:43
一、从本地读取lrc文件
从本地读取文件,android提供了与java相同的io操作,只不过要在AndroidManifest.xml添加读写sdcard权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
只要把路径传输进去,就可以取得io流。
File file=new File(FileUril.SDPATH + str);
在项目包src/file/FileUril.java中定义了静态的变量
Public SDPATH=Environment.getExternalStorageDirectory()+"/";
此句取得android的根目录("/"),这样就可以通过str这个参数定位到路径里。取得io流FileInputStream in=new FileInputStream(file);然后封装io流,且以UTF-8的格式,BufferedReaderb=newBufferedReader(new InputStreamReader(in,"utf-8")),接下来通过b.readLine()读取一行歌词数据,当读到结束时返回空。通过while循环就可以读取lrc所有数据。
代码如下:
public LrcParser(String str){index=0;musicDate=new ArrayList<String>();map=new HashMap<Long,String>(); String s="";File file=new File(FileUril.SDPATH+str); try {FileInputStream in=new FileInputStream(file); BufferedReader b=new BufferedReader(new InputStreamReader(in,"utf-8"));while((s=b.readLine())!=null){parser(s);}treeMap=new TreeMap<Long, String>(map);} catch (FileNotFoundException e) { e.printStackTrace();} catch (IOException e) {e.printStackTrace();} }
二、解析歌词lrc文件
在读取lrc数据时,通过调用parser(s)方法,实现歌词文件的读取,由于歌词信息不仅仅包含歌词,还有歌曲的一些作者信息,所以我们单独用字符判断就可以了。
在滤除了前面的信息后,设置正则表达式,由于歌词文件信息头为”[59:59.99]“,所以设置正则表达式String p="\\[([0-9]+:[0-9]+.[0-9]+)\\]";在正则表达式里有些标点字符用“\\”加该标点符号表示,如“[”,表示成“\\]”,因为“[、]、-”等是正则表达式的关键字。
“[0-9]”表示0到9中的一个数字,这样就可以匹配歌词信息。构造Pattern,这样就可以通过Pattern实例调用matcher匹配字符串了,返回的是Matcher对象,再通过该对象的find()方法就可以查询是否匹配了。
在find()函数返回的布尔类型,当为true时就表示查询的到。查询成功的话,利用pattern.split(str);将要解析的字符串以匹配字符为分割点,将字符串拆分,返回数组数据。
由于“[59:59.99][59:59.99]”找到的就是空格+空格+再加我们的歌词,我们需要的是最后面的数据,map.put(num,lrcContent[lrcContent.length-1]);知道我为什么len-1了吧。数据0开始,最后一个当然就是len-1了。将我们的数据保存。
但如何记录对应的时间呢,Matcher的group(int i)返回匹配字符,并前后剔除i个字符。String t=m.group(1);所以得到的字符数据位"59:59.99",再通过split将“59”,“59”,“99”分离出来,然后将字符串转换为整型,这样一来,我们的歌词时间点也记录了,这样一个个歌词信息通过map哈希表记录下来了。还有一个问题,由于有些歌词时间点几个都在一行,就是复歌部分,所以此map记录的数据歌词对应的时间就没有按一定的排序。所以我们还用到TreeMap,可以把map直接按键值排列。(另一种方法就是实现Comparable借口来实现排序,这样就更灵活)。
实现代码如下:
public void parser(String str){if(str.startsWith("[ti:")){musicDate.add(str.substring(4,str.length()-1));}if(str.startsWith("[ar:")){musicDate.add(str.substring(4,str.length()-1));}if(str.startsWith("[al:")){ musicDate.add(str.substring(4,str.length()-1));}String p="\\[([0-9]+:[0-9]+.[0-9]+)\\]";Pattern pattern=Pattern.compile(p);Matcher m=pattern.matcher(str);while(m.find()){String t=m.group(1); long num=ChartoLong(t); String lrcContent[]=pattern.split(str); if(lrcContent.length>1){ map.put(num,lrcContent[lrcContent.length-1]); }else{ map.put(num,""); }}}
2.4.1.3歌词显示
paint.setShader(shader);
这个类就能实现字体的渐变过程,x0,y0表示起始的位置,x1,y1,表示终点。这里歌词要横向过去的,所以我们设置
x0=0,y0=0,y1=0,x1等于字符的 长度。Colors这里要设置颜色值,第1位置表示渐变的开始颜色,第2位置就是终点颜色,positions设置的位置值比例,1表示全部,也是要设置两个值,分别表示起始颜色的位置,终点颜色的位置,后面是类型。
Shader shader = new LinearGradient(0,0,lrcLen + paint.getTextSize() * 5,0,new int[] { Color.RED, Color.GREEN },new float[] {deltax* (play.getCurrentPosition() - startTime)+ 0.1f,deltax* (play.getCurrentPosition() - startTime)+ 0.3f }, TileMode.CLAMP);paint.setShader(shader);
- lrc歌词解析(正则表达式)与歌词卡拉ok显示的思路
- 正则表达式练习: android 歌词解析lrc 转 txt 代码
- Qt的卡拉OK歌词效果
- Qt的卡拉OK歌词效果
- 使用ActionScript3正则表达式分析LRC歌词
- 卡拉OK歌词同步播放
- lrc歌词动态显示
- lrc 歌词解析项目
- LRC歌词解析
- Java LRC 歌词解析
- LRC歌词解析
- js解析lrc歌词
- Android解析lrc里的歌词
- 一个卡拉OK效果的自定义歌词控件
- lkmusic项目之(三)LRC歌词解析--正则解析
- Android版卡拉OK,歌词同步程序
- 卡拉OK伴唱歌词效果实现。
- android中解析lrc歌词
- 在Emacs调试JAVA程序,使用GUD模式
- 著名国画家金士焯
- 常用javascript
- IT讲堂:移除不必要软件的方法
- 小技巧之汇总二
- lrc歌词解析(正则表达式)与歌词卡拉ok显示的思路
- PhoneGap开发手机程序入门教程
- Android中AsyncTask的简单使用
- Flex创建弹出菜单(PopUpButton/Menu/PopMenuButton)
- 类似酷我音乐盒设计小总结(C#版)
- 第十三周任务(二)
- /usr/local/apache2/modules/libphp5.so cannot restore segment prot after reloc: Permission denied
- oracle 查询N秒之前的数据
- 常用正则表达式符号及其含义