介绍
这篇文章主要介绍android怎么实现歌词自动滚动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
最近在做安卓的MP3播放的项目,要实现歌词的自动滚动,以及同步显示。
抒情的歌词解析主要用yoyoplayer里面的,显示部分参考了这里,这里只是模拟MP3歌词的滚动。
先上一下效果图:
滚动实现的代码其实也简单。显示画出当前时间点的歌词,然后再分别画出改歌词后面和前面的歌,词前面的部分往上推移,后面的部分往下推移,这样就保持了当前时间歌词在中间。
代码如下LyricView,相关信息在注释了标明了。
package ru.org.piaozhiye.lyric;, import java.io.File, import 并不知道, import android.content.Context, import android.graphics.Canvas, import android.graphics.Color, import android.graphics.Paint, import android.graphics.Path, import android.graphics.Typeface, import android.util.AttributeSet, import android.widget.TextView,/* *, ,* @author root *大敌; ,*/public class  LyricView extends TextView  {, ,private Paint mPaint; ,private float mX; ,private static  Lyric mLyric, ,private Paint mPathPaint; ,public String test =,“test",, ,public int index =, 0;, ,private List< Sentence>,列表,, ,public float mTouchHistoryY; ,private int 我的; ,private long currentDunringTime;//,当前行歌词持续的时间,用该时间来sleep ,private float  middleY;//, y轴中间, ,private static  final int  DY =, 50,,//,每一行的间隔, ,public LyricView (Context 上下文),{, ,超级(上下文); ,init (); }大敌; ,public LyricView (Context 上下文,AttributeSet attr), {, ,超级(上下文,attr);, ,init (); }大敌; ,public LyricView (Context 上下文,AttributeSet attr,, int i), {, ,超级(上下文,attr, i),, ,init (); }大敌; ,private void  init (), {, ,setFocusable(真正的),, ,PlayListItem pli =, new PlayListItem (“Because  Of 你。,, ,“/sdcard/MP3/Because Of You.mp3",, 0 l,,真的),,=,,mLyric  new 抒情(new 文件(“/sdcard/MP3/Because Of You.lrc"),,照明灯具),,=,,list  mLyric.list;, ,//非高亮部分,=,,mPaint  new 油漆();, ,mPaint.setAntiAlias(真正的),, ,mPaint.setTextSize (22),, ,mPaint.setColor (Color.WHITE);, ,mPaint.setTypeface (Typeface.SERIF);, ,//高亮部分,当前歌词,=,,mPathPaint  new 油漆();, ,mPathPaint.setAntiAlias(真正的),, ,mPathPaint.setColor (Color.RED);, ,mPathPaint.setTextSize (22),, ,mPathPaint.setTypeface (Typeface.SANS_SERIF);, }大敌; ,protected void  onDraw (Canvas 画布),{, ,super.onDraw(画布);, ,canvas.drawColor (0 xefeffff),, ,Paint p =, mPaint;, ,Paint p2 =, mPathPaint;, ,p.setTextAlign (Paint.Align.CENTER);, ,if (index ==, 1), ,返回; ,p2.setTextAlign (Paint.Align.CENTER);, ,//先画当前行,之后再画他的前面和后面,这样就保持当前行在中间的位置, ,canvas.drawText (list.get(指数).getContent (),, mX,, middleY,, p2),, ,float tempY =, middleY;, ,//画出本句之前的句子, ,for (int 小姐:=,index 作用;1;,小姐:祝辞=,0;,我——),{, ,//Sentence sen =, list.get(我), ,//向上推移,=,,tempY  tempY 作用;DY,, ,if (tempY & lt;, 0), {, ,打破; }大敌; ,canvas.drawText (list.get (i) .getContent (),, mX,, tempY,, p),, ,//canvas.translate (0, DY);, }大敌;=,,tempY  middleY;, ,//画出本句之后的句子, ,for (int 小姐:=,index +, 1;,小姐:& lt;, list.size();,我+ +),{, ,//往下推移,=,,tempY  tempY +, DY,, ,if (tempY 祝辞,我的),{, ,打破; }大敌; ,canvas.drawText (list.get (i) .getContent (),, mX,, tempY,, p),, ,//canvas.translate (0, DY);, }大敌; }大敌; ,protected void  onSizeChanged (int w, int h, int 噢,,int 哦),{, ,super.onSizeChanged (w, h,,哎哟,,哦),, null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullandroid怎么实现歌词自动滚动效果