今天来谈谈歌词控件的实现。大体思路

先解析歌词,歌词配合控件的宽高计算坐标(歌词必须显示在行的中间),然后进行绘制onDraw,最后就是事件处理(歌词 拖动)和歌词随着时间自动移动,这个相对比较麻烦点。

小二   先上个图看看效果

来一段歌词源数据

[02:59.03][01:31.44]双眼也不需要魅力的长发也不需要魅力的长发
[03:07.54][01:33.99]我真不知道我们的命运会这样知道我们的命运会这样
[03:16.36][01:38.59]我只能牺牲自己的感情离你远去只能牺牲自己的感情离你远去
[03:51.19][01:46.80]我只好让你伤心的流泪
[03:52.94][01:57.69]远离你的世界
[03:55.07][02:02.47]我其实不需要你美丽的双眼
[03:57.81][02:06.22]也不需要魅力的长发  

按照上面格式对数据进行解析,这里比较简单,开始绘制,网上很多哥们说绘制的时候先绘制高亮区域,然后绘制高亮之前或者后面的歌词,我觉得没必要,只要坐标计算好了,拿起键盘一阵狂干,完事

 if (lrcs == null || lrcs.size() == 0) {//没有歌词canvas.drawText(noLrc, nolrcX, center, mNormalpaint);return;}for (int i = 0, size = lrcs.size(); i < size; i++) {LrcBean lrcBean = lrcs.get(i);String lrc = lrcBean.getLrc();if (!TextUtils.isEmpty(lrc)) {if (playTime >= lrcBean.getBeginTime() && playTime < lrcBean.getEndTime()) {canvas.drawText(lrc, lrcBean.getX(), lrcBean.getY(), mHighLightpaint);} else {canvas.drawText(lrc, lrcBean.getX(), lrcBean.getY(), mNormalpaint);}}}

这个时候不出意外的话,漂亮的歌词已经显示在你的手机上了,下面就要开始处理事件了onTouchEvent。这里就要用的系统提供的滑动工具类了Scroller,只要给他传入参数,它就可以控制控件的移动。其实这里也可以不用Scroller,我们可以直接变换坐标,也可以实现滑动效果,但是这样就会一直在计算坐标,效率有点略低

 public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:y = event.getY();isMoving = (isStop ? false : true);isClick = true;break;case MotionEvent.ACTION_MOVE:float durY = event.getY() - y;if (Math.abs(durY) > scaledTouchSlop / 2) {isClick = false;if (mlrcs.size() > 0 && !isStop) {if (getScrollY() < 0) {durY = durY / 3;} else if (getScrollY() > mlrcs.size() * wordHight) {durY = durY / 3;}scrollBy(getScrollX(), -(int) durY);y = event.getY();}}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:int old = getScrollY();if (old < 0) {smootscroll(mLrcDrawTool.getIndexline() * (wordHight) - old, ANIMATION_TIME, old);} else if (getScrollY() > mlrcs.size() * wordHight) {smootscroll(mLrcDrawTool.getIndexline() * (wordHight) - old, ANIMATION_TIME, old);}if (isClick) {isClick = true;if (mOnclicklisener != null) {mOnclicklisener.onClick();}}invalidate();isMoving = false;break;}return true;}

细心的你肯定会发现这里做了一个小小的处理,当歌词第一行歌词或者最后一个歌词滑动到中间位置的时候,把滑动偏移量消耗了一部分,效果看起来会好点。

下面就是重头戏,随着时间自动滚动。

 int indexline = mLrcDrawTool.getIndexline();if (preLrc != indexline) {int old = getScrollY();int offset = indexline * wordHight - old;smootscroll(offset, durtime, old);preLrc = indexline;invalidate();}

getScrollY 这个方法很重要,getScrollY就是当前view的左上角相对于母视图的左上角的Y轴偏移量。 当歌词第一移动上去,getScrollY的值也是变化一行歌词的高度,通过这种方式就可以计算出每次歌词的偏移量,然后给mScroller.startScroll(getScrollX(), old, getScrollX(), offset, durtime);传值,实现自动滚动。

好了逐行歌词已经完成,下面是demo地址

LrcView

如果想了解更多可以关注公众号:

LrcView逐行歌词相关推荐

  1. 我的Android进阶之旅------Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能...

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  2. LRC歌词原理和实现高仿Android网易云音乐

    大家好,我们是爱学啊,今天给大家带来一篇关于LRC歌词原理和在Android上如何实现歌词逐行滚动的效果,本文来自[Android开发项目实战我的云音乐]课程:逐字滚动下一篇文章讲解. 效果图 相信大 ...

  3. Android开发本地及网络Mp3音乐播放器(十七)已存在歌曲歌词下载

    转载请注明出处: http://blog.csdn.net/iwanghang/article/details/51388896 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 已存在歌曲 ...

  4. Android自定义View来实现解析lrc歌词同步滚动、上下拖动、缩放歌词等功能

    http://blog.csdn.net/ouyang_peng/article/details/50813419 前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌 ...

  5. Android获取歌词汇总

    Android获取歌词汇总 一.目标 二.网易云音乐 三.酷狗音乐 四.过程回顾 五.接下来 六.Finally 经历了几个开发阶段 Android实现歌词笔记构思 Android获取歌曲详细信息 A ...

  6. Android开发----lrc歌词的同步展示

    Android开发--lrc歌词的同步展示 别的不说,先上图,看效果 LrcFragment.java代码如下: package com.android.administrator.happymusi ...

  7. Android开发本地及网络Mp3音乐播放器(十六)歌词显示及滚动事件实现、ViewPager使用

    转载请注明出处: http://blog.csdn.net/iwanghang/article/details/51386317 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 歌词显示及 ...

  8. Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能

    原文地址https://blog.csdn.net/qq446282412/article/details/50813419 前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 ...

  9. 我的Android进阶之旅------gt;Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能...

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

最新文章

  1. 18.SSM整合_搭建开发环境
  2. 3D点云描述子超全综述:传统方式+深度学习方式
  3. hadoop的datanode多磁盘空间处理
  4. 老师,你和我的文具撞衫了!
  5. Discuz网警过滤关键词库
  6. Android逆向笔记-通过tracerPid对抗IDA调试
  7. 禁止和开启组策略的批处理
  8. git全局配置用户名和密码_git---全局设置用户名、密码、邮箱
  9. .c和.h文件的区别(转载)
  10. Ubuntu系统下允许Apache的mod_rewrite功能
  11. WebRTC入门知识
  12. SiteSucker Pro for Mac 4.3 强大的扒站神器
  13. ObjectiveC基础-ivar
  14. java excel 边框颜色_java(jxl) 改变excel表格背景及边框
  15. 内存颗粒位宽和容量_SDRAM内存模组的物理Bank与芯片位宽(高手进阶,终极内存技术指南——完整/进阶版)...
  16. apk应用加固与重签名—使用AndroidStudio自带工具apksigner
  17. 《自我分析》卡伦·霍尼阅读笔记1
  18. HTML+CSS实现渐变色标签,鼠标经过效果
  19. MYSQL数据库基本操作——DML
  20. SYD8811 使用外部32.768Khz晶振作为时钟源

热门文章

  1. linux dd报错,安装Mac版变色龙使用dd命令遇到Resource busy 错误
  2. 大一计算机生的生涯探索感悟和日记
  3. 跑步打卡!(2023-4-10)
  4. 年薪50万?智能仓储物流的从业者的薪酬水平| 你拖后腿了吗?(文尾索取报告)...
  5. ligerUi 格式化日期
  6. 谨此献给1980-1985年出生的人
  7. 蓝桥杯刷题021——填字母游戏(DFS)
  8. 入手多普达D900(T版)- 心疼
  9. linux启动dm数据库,DM数据库的启停以及数据库状态检查
  10. Photoshop CC 2018 软件安装包+破解教程