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

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 象山县| 台湾省| 花莲县| 锡林郭勒盟| 德阳市| 武川县| 磐安县| 太原市| 凤山县| 临汾市| 济源市| 伊吾县| 黄山市| 修武县| 德保县| 昂仁县| 九台市| 达拉特旗| 郑州市| 繁昌县| 响水县| 大安市| 兴文县| 连城县| 阜新| 南雄市| 阿鲁科尔沁旗| 定州市| 东源县| 军事| 探索| 辛集市| 休宁县| 桐城市| 汾西县| 青海省| 米林县| 鄂伦春自治旗| 内丘县| 绥化市| 鹤庆县|