前言: 项目有个音乐播发器功能,实现音乐在线播放,同时需要带有歌词显示功能。网上也找过,在github找到勉强能用的控件,只是效果还是差强人意,不是特别好。于是趁有空的时间,参考了网上的部分demo,自己也写了个歌词控件。

只要demo可以拉到最底部。

一.歌词控件效果。

目前的歌词控件效果如下:

主要效果有以下:

1.实现自动滑动切换到下一句。

2.实现滑动歌词切换播放时间。

3.实现拖动歌词时仿网易云音乐显示时间线,将要选择的歌词颜色变化。

4.音乐进度跳转时,歌词跳转可以滑动切换。

二.歌词控件实现逻辑说明

1.歌词解析。

歌词文件问lrc文件,歌词内容格式都是固定的[01:15.33] 或者 [00:00]这种格式。所以先把歌词内容通过一行一行的读取,每读取一行就解析。

List rows = new ArrayList();

// 循环地读取歌词的每一行

do {

line = br.readLine();

if (line != null && line.length() > 0) {

// 解析每一行歌词 得到每行歌词的集合,因为有些歌词重复有多个时间,就可以解析出多个歌词行来

List lrcRows = createRows(line);//解析行数据

if (lrcRows != null && lrcRows.size() > 0) {

for (LrcRow row : lrcRows) {

rows.add(row);

}

}

}

} while (line != null);

private List 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 listTimes = new ArrayList();

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;

}

}

LrcRow是实现Comparable的类,保存了没行歌词的数据,包括歌词内容、时间,实现Comparable可以通过时间来进行歌词排序。

public class LrcRow implements Comparable{

private String RowData;//行数据

private List ShowRows = new ArrayList();//显示的行

public String TimeText;

public long CurrentRowTime;

LrcShowRow是绘制显示的行数据,因为读取的没行数据,如果长度过长就可能要通过多行才能显示完,这时需要截取为多行显示。

public class LrcShowRow implements Comparable {

public String Data;// 行数据

public float RowHeight;// 行高度

public float RowPadding;// 行间距

public float YPosition =0;//绘画y位置

public int Index;//所在行坐标

2.歌词绘制

a.如果在手势滑动状态,绘制时间线

b.从第一行数据开始绘制,从头到位将所有行数据绘制一遍。注意的是,第一行开始绘制坐标FirstRowPositionY是动态控制,目的是方便手势滑动或者执行动画时改变这个坐标就能实现控件滑动效果。绘制过程中需要记录每一行绘制的Y位置,这个坐标的作用是为了执行动画时计算需要的滑动距离。如果当前行是选中行或者如果当前行是手势滑动时想要选择的行,改变为对应的显示颜色。

c.音乐播放时间跳转时,查找到歌词中与跳转时间最匹配的歌词,拿到将要选中位置下标TrySelectionPosition,然后执行动画,执行动画时先计算出总共偏移量然后一点点改变FirstRowPositionY偏移位置实现滑动效果。动画执行完成,将选中下标更改为TrySelectionPosition。

三.下载地址,欢迎issue

github下载地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android开发歌词滑动效果_漂亮的Android音乐歌词控件 仿网易云音乐滑动效果相关推荐

  1. android+仿最新网易云音乐底面栏,安卓仿网易云音乐通知栏控制音乐,默认显示Notification bigView...

    最近在做一个音乐播放器的时候遇到了一个关于notification的问题,在网上找了很久都没有头绪.后来找到了解决的办法,特意记录一下. 问题描述 首先请看网易云音乐的通知栏 普通高度的notific ...

  2. 仿网易云音乐的滑动冲突处理效果

    系列文章 此功能属于仿网易云音乐App的一部分 仿网易云音乐App(基础版) 实现网易云音乐的渐进式卡片切换 Flutter 自定义View--仿同花顺自选股列表 Flutter自定义View--仿高 ...

  3. Android漂亮的音乐歌词控件,仿网易云音乐滑动效果

    前言: 项目有个音乐播发器功能,实现音乐在线播放,同时需要带有歌词显示功能.网上也找过,在github找到勉强能用的控件,只是效果还是差强人意,不是特别好.于是趁有空的时间,参考了网上的部分demo, ...

  4. 仿网易云音乐app tab栏滑动效果

    <!DOCTYPE html> <html><head><meta charset="utf-8"><meta name=&q ...

  5. android 网易云音乐上滑动画,Android 仿网易云音乐 音轨跳动效果

    网易云音乐的Loading效果,大家应该也比较熟悉了,效果是一个红色音轨不断跳动的效果,一般用于Loading等待时填充使用.本篇来自定义这个效果. Android 仿网易云音乐 音轨跳动View.g ...

  6. 移动应用开发——uni-app框架 仿网易云音乐播放器学习心得

    目录 一.uni-app框架介绍 1.什么是 uni-app 2.为什么要选择uni-app 3.uni-app 统一规范 4.uni-app功能框架 二.开发工具与项目创建 1.开发工具 2.项目创 ...

  7. Android 仿网易云音乐App

    因为工作实在是有点忙,所以还没完成成品,就先挂到GitHub上.日后慢慢更新啦. 项目地址 GitHub地址,希望大佬们点个star GitHub仿网易云音乐App 效果展示 注:因为视频太模糊,每日 ...

  8. android仿网易云搜索,MaterialDesign之SearchView解锁 仿网易云音乐搜索

    原标题:MaterialDesign之SearchView解锁 仿网易云音乐搜索 本文作者 本文由CSDN_LQR投稿 CSDN_LQR的博客地址: http://www.jianshu.com/u/ ...

  9. android仿网易云音乐、即时通讯、bilibili、沙漏动画等源码

    Android精选源码 android仿网易云音乐安卓版源码 android开源即时通讯,实时传讯IM源码 android类似淘宝的商品详情页源码 android面向.艺术家.设计师等创意类作品源码 ...

  10. android 仿网易标签切换,高仿网易云音乐客户端的Home页面切换Tabhost-IT蓝豹

    1.高仿网易云音乐客户端的Home页面切换Tabhost 高仿网易云音乐客户端的Home页面切换Tabhost,并且三角形是透明的, 实现方式,自定义AnimTabsView继承 RelativeLa ...

最新文章

  1. 大数据、智慧城市成生态贵州新名片
  2. Maltego更新到4.1.6
  3. 参数数组长度_JS数组操作方法总结(二)——pop、shift、push、unshift
  4. Python 错误和异常小结
  5. PADS 创建封装笔记
  6. linux python 调试_Python教程:4环境变量与集成开发
  7. WIN32开发:如何获取父进程的ID
  8. C++跨平台IDE之CodeBlocks
  9. java实现相同分数排名_java做成绩排名表,如何实现同分同名次
  10. 由Handle转换为控件
  11. (备忘)卸载微软自带输入法
  12. 关于蓝桥杯竞赛考试的一些信息~
  13. python2和python3共存时,设置默认python为python3
  14. Fortran代码C化或Fortran与C/C++混编过程中矩阵转置的实现
  15. jdk API说明手册
  16. c语言中scanf的用法
  17. 原生JS活动倒计时实现思路
  18. 群晖QuickConnect与DDNS之间有何区别?
  19. 一道数学题,让芯片巨头亏了5亿美金!
  20. 【Linux操作系统】1. Linux操作系统简介、安装

热门文章

  1. Python 大数据的进行信用卡欺诈检测(附源码与注释)
  2. 电脑必备必装的软件工具神器,强烈推荐
  3. 专利申请模板,包含实用新型专利和发明专利模板
  4. python制作无限弹窗_Python无限弹窗,开机启动,打包为exe程序
  5. LinkedIn登录第三方网站
  6. 黑客是如何入侵电脑的,没有互联网可以入侵电脑吗?
  7. 神马js都是浮云-----限时秒杀
  8. 141种各类工业常用软件
  9. java中关闭数据库连接_在Java中关闭数据库连接
  10. 计算机大学离散数学难吗,大学离散数学怎么学