国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

android實(shí)現(xiàn)歌詞自動(dòng)滾動(dòng)效果

2019-12-12 00:27:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近在做Android 的MP3播放的項(xiàng)目,要實(shí)現(xiàn)歌詞的自動(dòng)滾動(dòng),以及同步顯示。

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

先上一下效果圖:

滾動(dòng)實(shí)現(xiàn)的代碼其實(shí)也簡(jiǎn)單。顯示畫出當(dāng)前時(shí)間點(diǎn)的歌詞,然后再分別畫出改歌詞后面和前面的歌詞,前面的部分往上推移,后面的部分往下推移,這樣就保持了當(dāng)前時(shí)間歌詞在中間。

代碼如下 LyricView,相關(guān)信息在注釋了標(biāo)明了。

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; // 當(dāng)前行歌詞持續(xù)的時(shí)間,用該時(shí)間來(lái)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);  // 高亮部分 當(dāng)前歌詞  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);  // 先畫當(dāng)前行,之后再畫他的前面和后面,這樣就保持當(dāng)前行在中間的位置  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  * 當(dāng)前歌詞的時(shí)間軸  *  * @return currentDunringTime 歌詞只需的時(shí)間  */  public long updateIndex(long time) {  // 歌詞序號(hào)  index = mLyric.getNowSentenceIndex(time);  if (index == -1)  return -1;  Sentence sen = list.get(index);  // 返回歌詞持續(xù)的時(shí)間,在這段時(shí)間內(nèi)sleep  return currentDunringTime = sen.getDuring();  } } 

剩下的就是使用他了。就是取出歌詞的index,和該行歌詞持續(xù)的時(shí)間進(jìn)行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; // 開始 的時(shí)間,不能為零,否則前面幾句歌詞沒有顯示出來(lái)  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(); // 更新視圖  }  }; } 

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 麟游县| 监利县| 台北市| 河间市| 安陆市| 磐石市| 葵青区| 义马市| 射洪县| 巢湖市| 石城县| 宜章县| 青河县| 西贡区| 临泉县| 佳木斯市| 平山县| 车致| 鹤庆县| 深圳市| 新沂市| 达孜县| 宁河县| 长海县| 黄梅县| 皋兰县| 怀柔区| 彰武县| 新营市| 普兰店市| 固镇县| 金湖县| 喀喇| 工布江达县| 白朗县| 神池县| 玛纳斯县| 天柱县| 寿阳县| 香河县| 娱乐|