亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android實現歌詞自動滾動效果

2019-10-21 21:36:10
字體:
來源:轉載
供稿:網友

最近在做Android 的MP3播放的項目,要實現歌詞的自動滾動,以及同步顯示。

lyric的歌詞解析主要用yoyoplayer里面的,顯示部分參考了 ,這里只是模擬MP3歌詞的滾動。

先上一下效果圖:

android,歌詞,自動滾動

滾動實現的代碼其實也簡單。顯示畫出當前時間點的歌詞,然后再分別畫出改歌詞后面和前面的歌詞,前面的部分往上推移,后面的部分往下推移,這樣就保持了當前時間歌詞在中間。

代碼如下 LyricView,相關信息在注釋了標明了。

package ru.org.piaozhiye.lyric; import java.io.File; import java.util.List; 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> list;  public float mTouchHistoryY;  private int mY;  private long currentDunringTime; // 當前行歌詞持續的時間,用該時間來sleep  private float middleY;// y軸中間  private static final int DY = 50; // 每一行的間隔  public LyricView(Context context) {  super(context);  init();  }  public LyricView(Context context, AttributeSet attr) {  super(context, attr);  init();  }  public LyricView(Context context, AttributeSet attr, int i) {  super(context, attr, i);  init();  }  private void init() {  setFocusable(true);  PlayListItem pli = new PlayListItem("Because Of You",   "/sdcard/MP3/Because Of You.mp3", 0L, true);  mLyric = new Lyric(new File("/sdcard/MP3/Because Of You.lrc"), pli);  list = mLyric.list;  // 非高亮部分  mPaint = new Paint();  mPaint.setAntiAlias(true);  mPaint.setTextSize(22);  mPaint.setColor(Color.WHITE);  mPaint.setTypeface(Typeface.SERIF);  // 高亮部分 當前歌詞  mPathPaint = new Paint();  mPathPaint.setAntiAlias(true);  mPathPaint.setColor(Color.RED);  mPathPaint.setTextSize(22);  mPathPaint.setTypeface(Typeface.SANS_SERIF);  }  protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  canvas.drawColor(0xEFeffff);  Paint p = mPaint;  Paint p2 = mPathPaint;  p.setTextAlign(Paint.Align.CENTER);  if (index == -1)   return;  p2.setTextAlign(Paint.Align.CENTER);  // 先畫當前行,之后再畫他的前面和后面,這樣就保持當前行在中間的位置  canvas.drawText(list.get(index).getContent(), mX, middleY, p2);  float tempY = middleY;  // 畫出本句之前的句子  for (int i = index - 1; i >= 0; i--) {   // Sentence sen = list.get(i);   // 向上推移   tempY = tempY - DY;   if (tempY < 0) {   break;   }   canvas.drawText(list.get(i).getContent(), mX, tempY, p);   // canvas.translate(0, DY);  }  tempY = middleY;  // 畫出本句之后的句子  for (int i = index + 1; i < list.size(); i++) {   // 往下推移   tempY = tempY + DY;   if (tempY > mY) {   break;   }   canvas.drawText(list.get(i).getContent(), mX, tempY, p);   // canvas.translate(0, DY);  }  }  protected void onSizeChanged(int w, int h, int ow, int oh) {  super.onSizeChanged(w, h, ow, oh);  mX = w * 0.5f; // remember the center of the screen  mY = h;  middleY = h * 0.5f;  }  //  /**  * @param time  *  當前歌詞的時間軸  *  * @return currentDunringTime 歌詞只需的時間  */  public long updateIndex(long time) {  // 歌詞序號  index = mLyric.getNowSentenceIndex(time);  if (index == -1)   return -1;  Sentence sen = list.get(index);  // 返回歌詞持續的時間,在這段時間內sleep  return currentDunringTime = sen.getDuring();  } } 

剩下的就是使用他了。就是取出歌詞的index,和該行歌詞持續的時間進行sleep。

package ru.org.piaozhiye; import java.io.IOException; import ru.org.piaozhiye.lyric.LyricView; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; public class LyricDemo extends Activity {  private MediaPlayer mp;  private LyricView lyricView;  private String path = "/sdcard/MP3/Because Of You.mp3";  /** Called when the activity is first created. */  @Override  public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  lyricView = (LyricView) findViewById(R.id.audio_lrc);  mp = new MediaPlayer();  mp.reset();  try {   mp.setDataSource(path);   mp.prepare();  } catch (IllegalArgumentException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (IllegalStateException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  mp.start();  new Thread(new UIUpdateThread()).start();  }  class UIUpdateThread implements Runnable {  long time = 100; // 開始 的時間,不能為零,否則前面幾句歌詞沒有顯示出來  public void run() {   while (mp.isPlaying()) {   long sleeptime = lyricView.updateIndex(time);   time += sleeptime;   mHandler.post(mUpdateResults);   if (sleeptime == -1)    return;   try {    Thread.sleep(sleeptime);   } catch (InterruptedException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }   }  }  }  Handler mHandler = new Handler();  Runnable mUpdateResults = new Runnable() {  public void run() {   lyricView.invalidate(); // 更新視圖  }  }; } 

整個project的源碼。包括yoyoplayer的解析lyric部分代碼。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费观看高清| 懂色av影视一区二区三区| 欧美国产乱视频| 2019亚洲男人天堂| 亚洲第一区在线| 亚洲国产精品va在线看黑人动漫| 日韩精品免费在线视频观看| 亚洲人成在线观看网站高清| 自拍偷拍亚洲一区| 久久国产精品影视| 国产精品一二区| 亚洲伊人一本大道中文字幕| 成人性教育视频在线观看| 亚洲高清免费观看高清完整版| 4438全国亚洲精品在线观看视频| 超碰91人人草人人干| 久久久极品av| 不卡毛片在线看| 国产成人在线亚洲欧美| 日韩av网址在线| 97久久伊人激情网| 国产精品白丝av嫩草影院| 色婷婷av一区二区三区在线观看| 国产精品中文久久久久久久| 国产一区二区av| 欧美中文字幕第一页| 亚洲的天堂在线中文字幕| 夜夜躁日日躁狠狠久久88av| 91精品国产91久久久久久最新| 夜夜嗨av一区二区三区免费区| 欧美做受高潮1| 久久人人爽人人爽人人片av高请| 亚洲欧洲日韩国产| 国产精品久久久久久中文字| 欧美国产日韩二区| 精品亚洲一区二区三区在线观看| 久久视频在线播放| 91av在线国产| 搡老女人一区二区三区视频tv| 久久精品成人一区二区三区| 国产a∨精品一区二区三区不卡| 欧美大片免费看| 亚洲一区二区三区视频| 最新91在线视频| 不卡在线观看电视剧完整版| 少妇久久久久久| 亚洲一区二区在线| 成人黄色av播放免费| 久久亚洲精品小早川怜子66| 国产精品综合不卡av| 国产成人精品优优av| 国产精品69精品一区二区三区| 国产一区二区日韩精品欧美精品| 日韩精品中文字幕有码专区| 国产精品一香蕉国产线看观看| 久久人人爽人人爽人人片av高清| 久久91精品国产91久久跳| 亚洲天堂av在线免费| 91av视频在线播放| 国产精品va在线播放我和闺蜜| 欧美人与性动交a欧美精品| 久久亚洲精品国产亚洲老地址| 日韩久久精品电影| xx视频.9999.com| 国产一区二区三区免费视频| 欧美日韩精品二区| 97超碰国产精品女人人人爽| 欧美亚洲成人精品| 欧美极品少妇xxxxⅹ裸体艺术| 欧美怡春院一区二区三区| 欧美激情国产精品| 色婷婷av一区二区三区在线观看| 国产精品日韩久久久久| 久久久久久噜噜噜久久久精品| 欧美成人免费在线观看| 92看片淫黄大片看国产片| 国产精品免费观看在线| 992tv成人免费影院| 欧洲成人在线视频| 久久伊人精品一区二区三区| 在线精品播放av| 久久久久久av| 欧美精品在线极品| 欧美又大又粗又长| 亚洲白虎美女被爆操| 亚洲国产97在线精品一区| 亚洲自拍偷拍色图| 国产精品久久视频| 永久免费精品影视网站| 国产精品亚洲аv天堂网| 亚洲美女喷白浆| 欧美肥婆姓交大片| 亚洲精品动漫100p| 午夜精品久久久久久久99热| 国产在线视频一区| 亚洲欧美三级伦理| 国产亚洲激情视频在线| 国产精品第一第二| 亚洲精品成人网| 久久成人精品视频| 久久久亚洲影院你懂的| 日韩69视频在线观看| 国产精品视频内| 日韩在线精品视频| 国产精品扒开腿做爽爽爽的视频| 欧美一二三视频| 欧美久久精品午夜青青大伊人| 日韩精品中文字幕有码专区| 91伊人影院在线播放| 欧洲亚洲妇女av| 亚洲人线精品午夜| 最新中文字幕亚洲| 日韩中文字幕精品视频| 日韩中文字幕第一页| 亚洲视屏在线播放| 精品久久久久久| 国产视频久久久久| 这里只有精品视频在线| 日韩中文字幕免费| 91精品国产91久久久久久不卡| 精品无人国产偷自产在线| 青青久久av北条麻妃黑人| 岛国av午夜精品| 国产精品福利小视频| 国内精品一区二区三区四区| 国产一区二区三区丝袜| 欧美性猛交xxxx乱大交蜜桃| 成人免费淫片aa视频免费| 久久久久久亚洲精品中文字幕| **欧美日韩vr在线| 精品一区二区三区四区| 日韩免费观看在线观看| 亚洲激情久久久| 亚洲3p在线观看| 国产精品黄色影片导航在线观看| 久久人人爽人人| 亚洲国产天堂网精品网站| 中文字幕日韩欧美精品在线观看| 日韩在线免费高清视频| 69久久夜色精品国产69乱青草| 亚洲韩国欧洲国产日产av| 精品久久久一区二区| 国产亚洲一区二区精品| 欧美日在线观看| 91精品国产91久久久久久吃药| 欧美激情亚洲视频| 欧美午夜精品久久久久久人妖| 欧美性猛交xxxx乱大交3| 亚洲欧美精品一区二区| 自拍视频国产精品| 亚洲色图18p| 日韩一区二区av| 国产69久久精品成人看| 国产精品成人在线| 国产精品视频一区二区三区四| 国产精品日韩在线一区| 日韩欧美在线视频日韩欧美在线视频| 日韩一区二区福利| 国产成人精品a视频一区www| 国产美女主播一区| 亚洲成人av在线播放| 欧美精品在线第一页| 一区二区三区久久精品| 黄色精品在线看|