Android漂亮的音乐歌词控件,仿网易云音乐滑动效果
前言: 项目有个音乐播发器功能,实现音乐在线播放,同时需要带有歌词显示功能。网上也找过,在github找到勉强能用的控件,只是效果还是差强人意,不是特别好。于是趁有空的时间,参考了网上的部分demo,自己也写了个歌词控件。
只要demo可以拉到最底部。
一.歌词控件效果。
目前的歌词控件效果如下:
主要效果有以下:
1.实现自动滑动切换到下一句。
2.实现滑动歌词切换播放时间。
3.实现拖动歌词时仿网易云音乐显示时间线,将要选择的歌词颜色变化。
4.音乐进度跳转时,歌词跳转可以滑动切换。
二.歌词控件实现逻辑说明
1.歌词解析。
歌词文件问lrc文件,歌词内容格式都是固定的[01:15.33] 或者 [00:00]这种格式。所以先把歌词内容通过一行一行的读取,每读取一行就解析。
List<LrcRow> rows = new ArrayList<LrcRow>();
// 循环地读取歌词的每一行
do {
line = br.readLine();
if (line != null && line.length() > 0) {
// 解析每一行歌词 得到每行歌词的集合,因为有些歌词重复有多个时间,就可以解析出多个歌词行来
List<LrcRow> lrcRows = createRows(line);//解析行数据
if (lrcRows != null && lrcRows.size() > 0) {
for (LrcRow row : lrcRows) {
rows.add(row);
}
}
}
} while (line != null);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
private List<LrcRow> createRows(String standardLrcLine) {
try {
// [01:15.33] 或者 [00:00]这种格式
Boolean Form1 = standardLrcLine.indexOf("[") == 0 && standardLrcLine.indexOf("]") == 9;
Boolean Form2 = standardLrcLine.indexOf("[") == 0 && standardLrcLine.indexOf("]") == 6;
if (!Form1 && !Form2) {
return null;
}
int lastIndexOfRightBracket = standardLrcLine.lastIndexOf("]");
String content = standardLrcLine.substring(lastIndexOfRightBracket + 1, standardLrcLine.length());
String times = standardLrcLine.substring(0, lastIndexOfRightBracket + 1).replace("[", "-").replace("]",
"-");
String arrTimes[] = times.split("-");
List<LrcRow> listTimes = new ArrayList<LrcRow>();
for (String temp : arrTimes) {
if (temp.trim().length() == 0) {
continue;
}
LrcRow lrcRow = new LrcRow(content, temp, timeConvert(temp));
listTimes.add(lrcRow);
}
return listTimes;
} catch (Exception e) {
return null;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
LrcRow是实现Comparable的类,保存了没行歌词的数据,包括歌词内容、时间,实现Comparable可以通过时间来进行歌词排序。
public class LrcRow implements Comparable<LrcRow>{
private String RowData;//行数据
private List<LrcShowRow> ShowRows = new ArrayList<LrcShowRow>();//显示的行
public String TimeText;
public long CurrentRowTime;
- 1
- 2
- 3
- 4
- 5
- 6
LrcShowRow是绘制显示的行数据,因为读取的没行数据,如果长度过长就可能要通过多行才能显示完,这时需要截取为多行显示。
public class LrcShowRow implements Comparable<LrcShowRow> {
public String Data;// 行数据
public float RowHeight;// 行高度
public float RowPadding;// 行间距
public float YPosition =0;//绘画y位置
public int Index;//所在行坐标
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.歌词绘制
a.如果在手势滑动状态,绘制时间线
b.从第一行数据开始绘制,从头到位将所有行数据绘制一遍。注意的是,第一行开始绘制坐标FirstRowPositionY是动态控制,目的是方便手势滑动或者执行动画时改变这个坐标就能实现控件滑动效果。绘制过程中需要记录每一行绘制的Y位置,这个坐标的作用是为了执行动画时计算需要的滑动距离。如果当前行是选中行或者如果当前行是手势滑动时想要选择的行,改变为对应的显示颜色。
c.音乐播放时间跳转时,查找到歌词中与跳转时间最匹配的歌词,拿到将要选中位置下标TrySelectionPosition,然后执行动画,执行动画时先计算出总共偏移量然后一点点改变FirstRowPositionY偏移位置实现滑动效果。动画执行完成,将选中下标更改为TrySelectionPosition。
转载注明:http://blog.csdn.net/u014614038/article/details/72303128
三.下载地址,欢迎issue
-
joshua66666 2017-05-23 11:05:55 #1楼我最近也在写, 需要翻译. 楼主的支持双语的lrc吗查看回复(1)
- 上一页
- 1
- 下一页
模仿音乐播放器项目
这个项目是过年回家做的,虽然还不够完善,但是实现了主要的功能,另外还增加了甩歌功能。本来想增加滑动图片切歌这个功能呢,但是还不知道怎么获取音乐资源的相关图片,如果有会的希望指正。 ...
android-音乐播放器实现及源码下载(一)
从本文开始,详细讲述一个音乐播放器的实现,以及从网络解析数据获取最新推荐歌曲以及歌曲下载的功能。 功能介绍如下: 1、获取本地歌曲列表,实现歌曲播放功能。 2、利用硬件加速感应器,摇动手机实现切...
android 音乐播放器,炫丽UI仿天天动听
2015年01月20日 24.43MB 下载
收集了很多音乐播放器类的Android项目源码,非常不错的开源项目【转】
from:http://blog.csdn.net/java173842219/article/details/54096598 JieCaoVideoPlayer立志成为Android平台使用...
高仿《酷狗音乐播放器》android源码
2014年06月05日 11.08MB 下载
仿网易云音乐 安卓版
2017年05月08日 17.91MB 下载
仿网易云音乐界面UI
2016年04月23日 31.66MB 下载
最新文章
个人分类
归档
- 2018年5月11篇
- 2018年3月3篇
- 2018年2月4篇
- 2018年1月3篇
- 2017年12月5篇
- 2017年11月4篇
- 2017年10月5篇
- 2017年9月9篇
- 2017年8月7篇
- 2017年7月5篇
- 2017年6月4篇
- 2017年5月9篇
- 2017年4月2篇
- 2017年3月2篇
- 2017年2月3篇
- 2017年1月1篇
- 2016年12月6篇
- 2016年11月1篇
- 2016年10月2篇
- 2016年9月6篇
- 2016年7月2篇
- 2016年6月1篇
- 2016年5月5篇
- 2016年4月5篇
- 2016年3月2篇
- 2016年2月1篇
- 2015年12月2篇
- 2015年11月6篇
- 2015年10月9篇
- 2015年9月4篇
- 2015年8月18篇
- 2015年7月1篇
热门文章
- 教你如何使用okhttp缓存
阅读量:20681
- android txt小说阅读器的实现
阅读量:17714
- Fresco源码赏析 之 基本流程
阅读量:5812
- Fresco源码赏析 之 图片显示流程
阅读量:4847
- android aidl文件无法自动生成java文件
阅读量:3599
最新评论
- android阅读器长按选择文字功...
Ncopy:[reply]u014614038[/reply] 好的,谢谢~
- android阅读器长按选择文字功...
u014614038:[reply]Ncopy[/reply] 上下滑动目前不行,但是可以做到左右翻页,不知道是否满足,...
- android阅读器长按选择文字功...
Ncopy:[reply]u014614038[/reply] 是可以上下滑动选择文字,但是如果文字很多,能不...
- android阅读器长按选择文字功...
u014614038:[reply]Ncopy[/reply] 可以上下滑动选择文字的
- android阅读器长按选择文字功...
Ncopy:大神,这个代码可以加上下滚动吗?
1
目录
收藏
评论