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

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 济源市| 双鸭山市| 西峡县| 辽阳市| 康马县| 长泰县| 郓城县| 玛纳斯县| 铁岭县| 肇州县| 深泽县| 唐海县| 金门县| 邢台市| 资溪县| 义马市| 民县| 平原县| 平武县| 郯城县| 周至县| 林芝县| 屏山县| 玉林市| 凤城市| 会泽县| 西乌| 闸北区| 鄂托克前旗| 米脂县| 通州区| 普陀区| 无极县| 崇文区| 家居| 简阳市| 阳曲县| 若尔盖县| 卢湾区| 资溪县| 新安县|