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

首頁 > 系統 > Android > 正文

android播放器實現歌詞顯示功能

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

網上android播放器雖然挺多,感覺提供的歌詞顯示功能比較死板,要么搜索給的條件死死的,要么放置sdcard內部的歌詞格式需要統一,應該提供類似文件夾瀏覽的功能。^_^,不過在這之前先搞定歌詞的現實界面:

播放器的歌詞界面實現以下幾個功能

  • 根據歌曲的播放進度自下而上滾動;
  • 提供上下拖動調整歌曲進度的功能;
  • 突出顯示當前進度的歌詞段,并保證該歌詞段處于布局中心

不多說了直接貼代碼,首先開啟一個線程每隔一段時間往view中送入一串字符

Java代碼

import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;  public class TextAlign extends GraphicsActivity implements OnClickListener {    private SampleView mView;    @Override   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     // Animation in = AnimationUtils.loadAnimation(this, R.anim.push_up_in);      // mView.setAnimation(in);     setContentView(R.layout.main);     mView =(SampleView) findViewById(R.id.text01);      Button bt = (Button) findViewById(R.id.Button01);     bt.setOnClickListener(this);          new Thread(new UIUpdateThread()).start();    }    class UIUpdateThread implements Runnable {     long time = 40000;      long sleeptime = 100;     public void run() {       try {         while (time < 200000) {           Thread.sleep(sleeptime);           mView.updateIndex(time);//.index = mLyric.getNowSentenceIndex(time); //         Log.v("UIThread", mView.index + ":" + time);           time += sleeptime;           mHandler.post(mUpdateResults);         }       } catch (InterruptedException e) {         e.printStackTrace();       }     }   }   Handler mHandler = new Handler();   Runnable mUpdateResults = new Runnable() {     public void run() {       mView.invalidate(); // 更新視圖     }   };    @Override   public void onClick(View v) {     mView.mTouchHistoryY -=30;     mHandler.post(mUpdateResults);   } } 

     這里將時間送到SampleView中,該類對此時間進行加工得到一系列list(該list是動態生成的),從而根據時間的推移遞增的得到一系列的字串。這個過程模擬了歌詞的顯示過程

      接下來的SampleView繼承了TextView并重載了onDraw方法.注意,這里只給了個sample,里面歌詞怎么生成的見YOYOPlayer。這里就不給代碼了

Java代碼

 

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.util.Log; import android.view.MotionEvent; import android.widget.TextView; import android.widget.Toast;  import com.android.lyric.Lyric; import com.android.lyric.PlayListItem; import com.android.lyric.Sentence;  public class SampleView extends TextView {     private Paint mPaint;     private float mX;     private static Lyric mLyric;      private Path mPath;     private Paint mPathPaint;     public String test = "test";     public int index = 0;     private List<Sentence> list;      private float mTouchStartY;     private float mTouchCurrY;     public float mTouchHistoryY;      private int mY;     private long currentTime;     private long currentDunringTime;     private long sentenctTime;     private float middleY;     private String middleContent="Empty";     private static final int DY = 30;      private static void makePath(Path p) {       p.moveTo(10, 0);       p.cubicTo(100, -50, 200, 50, 300, 0);     }       public SampleView(Context context) {       super(context);       init();     }     public SampleView(Context context,AttributeSet attr) {       super(context,attr);       init();     }     public SampleView(Context context,AttributeSet attr,int i) {       super(context,attr,i);       init();     }      private void init() {       setFocusable(true);       PlayListItem pli = new PlayListItem("", "", 1000L, true);       mLyric = new Lyric(new File("/sdcard/M0005044007.lrc"), pli);        list = mLyric.list;       mPaint = new Paint();       mPaint.setAntiAlias(true);       mPaint.setTextSize(20);       mPaint.setTypeface(Typeface.SERIF);         mPath = new Path();       makePath(mPath);        mPathPaint = new Paint();       mPathPaint.setAntiAlias(true);       mPathPaint.setColor(0x800000FF);       mPathPaint.setStyle(Paint.Style.STROKE);     }           @Override     protected void onDraw(Canvas canvas) {       super.onDraw(canvas);        canvas.drawColor(Color.WHITE);        Paint p = mPaint;       float x = mX;       float plus =currentDunringTime==0?index*30: index*30 +(((float)currentTime - (float)sentenctTime)/(float)currentDunringTime)*(float)30;       float y = mY- plus+mTouchCurrY - mTouchStartY+mTouchHistoryY;                canvas.translate(0,y);        for (int i = 0; i < index; i++) {         String text = list.get(i).getContent();         if((y+i*30)<=middleY&&(y+i*30+30)>=middleY)           middleContent = text;         p.setTextAlign(Paint.Align.CENTER);         canvas.drawText(text, x, 0, p);         // mY- mY/lines*(index - i)         canvas.translate(0, DY);       }     }       @Override     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;     }      @Override     public boolean onTouchEvent(MotionEvent event) {       float y = event.getY();        switch (event.getAction()) {       case MotionEvent.ACTION_DOWN:         mTouchHistoryY += mTouchCurrY - mTouchStartY;         mTouchStartY =mTouchCurrY= y;         invalidate();         break;       case MotionEvent.ACTION_MOVE:         mTouchCurrY = y;         invalidate();         break;       case MotionEvent.ACTION_UP:         Log.v("Lyric content", middleContent.length()+"");         CharSequence chars = new CharSequence(){            @Override           public char charAt(int index) {             // TODO Auto-generated method stub             return middleContent.charAt(index);           }            @Override           public int length() {             // TODO Auto-generated method stub             return middleContent.length();           }            @Override           public CharSequence subSequence(int start, int end) {             // TODO Auto-generated method stub             return middleContent.subSequence(start, end);           }           @Override           public String toString(){             return middleContent;           }         };         Toast toast = Toast.makeText(SampleView.this.getContext(),chars, 1000);         toast.show();         invalidate();         break;       }       return true;     }       public void updateIndex(long time) {       this.currentTime = time;       index = mLyric.getNowSentenceIndex(time);       Sentence sen = list.get(index);       currentDunringTime = sen.getDuring();       sentenctTime = sen.getFromTime();     }   } 

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品999| 亚洲人成电影网站色xx| 久久在线免费视频| 国产精品久久久久久超碰| 欧美日韩中文字幕| 日韩中文字幕亚洲| 中文字幕日韩欧美| 欧美极品少妇xxxxⅹ免费视频| 日韩av在线导航| 国产精品嫩草视频| 91精品国产综合久久香蕉最新版| 色综合久综合久久综合久鬼88| 欧美成人全部免费| 97色在线观看| 亚洲3p在线观看| 日韩av在线免费观看一区| 久久精品91久久久久久再现| 日韩美女视频在线观看| 俺也去精品视频在线观看| 在线精品国产成人综合| 红桃视频成人在线观看| 亚洲美女自拍视频| 日韩激情第一页| 欧美俄罗斯性视频| 成人av在线网址| 日韩电影免费观看在线观看| 中文字幕成人精品久久不卡| 国产一区二区激情| 亚洲第一综合天堂另类专| 欧美中文字幕在线播放| www.日本久久久久com.| y97精品国产97久久久久久| 日本一本a高清免费不卡| 久久久欧美一区二区| 日韩国产精品亚洲а∨天堂免| 黑人精品xxx一区| 日韩av网站大全| 成人性生交xxxxx网站| 久久久人成影片一区二区三区| 91欧美日韩一区| 久久久国产精品免费| 91国产中文字幕| 亚洲人成网站色ww在线| 久久久人成影片一区二区三区| 亚洲一区二区三区在线视频| 欧美另类极品videosbest最新版本| 日韩国产精品亚洲а∨天堂免| 日韩精品在线观看网站| 亚洲欧美国产精品专区久久| 国产精品中文字幕久久久| 国产网站欧美日韩免费精品在线观看| 国产成一区二区| 久久99热精品| 亚洲欧洲偷拍精品| 精品高清美女精品国产区| 国产精品永久免费| 亚洲一区二区免费在线| www.日韩系列| 亚洲国产精品va在线看黑人| 亚洲国产欧美一区| 日韩在线视频免费观看| 欧美日韩国产成人高清视频| 欧美午夜电影在线| 亚洲国内精品视频| 久久露脸国产精品| 亚洲国产欧美一区二区丝袜黑人| 日韩小视频在线| 亚洲福利视频二区| 亚洲成色777777在线观看影院| 亚洲自拍在线观看| 亚洲精品视频免费在线观看| 国产综合色香蕉精品| 狠狠综合久久av一区二区小说| 欧美精品激情blacked18| 97超级碰碰人国产在线观看| 最近2019年日本中文免费字幕| 国产做受高潮69| 蜜臀久久99精品久久久无需会员| 欧美人成在线视频| 九九热精品视频国产| 国产91成人video| 一区二区欧美日韩视频| 国产亚洲精品高潮| 亚洲欧美日本精品| 国产情人节一区| 亚洲在线www| 久久精品国产精品| 国产午夜精品一区理论片飘花| 国产精品美女免费看| 亚洲一区二区三区在线免费观看| 精品欧美aⅴ在线网站| 亚洲最大的成人网| 亚洲国产高清高潮精品美女| 欧美精品日韩www.p站| 久久久亚洲影院你懂的| 亚洲bt天天射| 欧美高清第一页| 国产女人精品视频| 午夜精品视频在线| 麻豆国产精品va在线观看不卡| 俺也去精品视频在线观看| 亚洲一区二区三区久久| 国产精品亚洲欧美导航| 中文国产成人精品久久一| 全球成人中文在线| 欧美在线视频一区| 91免费看片在线| 亚洲天堂免费视频| 欧美激情一级欧美精品| 久久久97精品| 亚洲视频一区二区| 欧美黑人巨大xxx极品| 国产97在线视频| 欧美性生交大片免网| 国产成人精品免费视频| 成人欧美在线观看| 日韩中文娱乐网| 欧美噜噜久久久xxx| 日韩女在线观看| 亚洲第一综合天堂另类专| 久久最新资源网| 成人在线免费观看视视频| 久久久av网站| 一区二区三区亚洲| 欧美另类高清videos| 夜夜躁日日躁狠狠久久88av| 国产精品视频网址| 91国内揄拍国内精品对白| 亚洲精品久久久一区二区三区| 91手机视频在线观看| 亚洲国产又黄又爽女人高潮的| 日韩电影中文字幕| 亚洲一区中文字幕| 亚洲自拍欧美色图| 日韩欧美中文字幕在线观看| 国产精品中文字幕在线观看| 亚洲无限乱码一二三四麻| 欧美寡妇偷汉性猛交| 久久精品国产亚洲精品| 日韩免费中文字幕| 91高清免费在线观看| 久久精品视频在线播放| 欧美精品videosex性欧美| 日本高清不卡在线| 色综合久久88色综合天天看泰| 性色av一区二区三区在线观看| 国产视频在线观看一区二区| 在线视频中文亚洲| 91黄色8090| 久久综合久久八八| 欧亚精品中文字幕| 欧美一区二区影院| 国产精品视频白浆免费视频| 亚洲成成品网站| 亚洲第一免费网站| 亚洲一二三在线| 国产精品九九久久久久久久| 欧美寡妇偷汉性猛交| 国产精品美女在线| 成人免费观看49www在线观看| 国产午夜精品美女视频明星a级| 亚洲四色影视在线观看| 国产成人avxxxxx在线看| 国产成人91久久精品|