android播放器实现歌词显示功能
网上android播放器虽然挺多,感觉提供的歌词显示功能比较死板,要么搜索给的条件死死的,要么放置sdcard内部的歌词格式需要统一,应该提供类似文件夹浏览的功能。^_^,不过在这之前先搞定歌词的现实界面:
播放器的歌词界面实现以下几个功能
- 根据歌曲的播放进度自下而上滚动;
- 提供上下拖动调整歌曲进度的功能;
- 突出显示当前进度的歌词段,并保证该歌词段处于布局中心
不多说了直接贴代码,首先开启一个线程每隔一段时间往view中送入一串字符
Java代码
importandroid.os.Bundle; importandroid.os.Handler; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassTextAlignextendsGraphicsActivityimplementsOnClickListener{ privateSampleViewmView; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //Animationin=AnimationUtils.loadAnimation(this,R.anim.push_up_in); //mView.setAnimation(in); setContentView(R.layout.main); mView=(SampleView)findViewById(R.id.text01); Buttonbt=(Button)findViewById(R.id.Button01); bt.setOnClickListener(this); newThread(newUIUpdateThread()).start(); } classUIUpdateThreadimplementsRunnable{ longtime=40000; longsleeptime=100; publicvoidrun(){ 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(InterruptedExceptione){ e.printStackTrace(); } } } HandlermHandler=newHandler(); RunnablemUpdateResults=newRunnable(){ publicvoidrun(){ mView.invalidate();//更新视图 } }; @Override publicvoidonClick(Viewv){ mView.mTouchHistoryY-=30; mHandler.post(mUpdateResults); } }
这里将时间送到SampleView中,该类对此时间进行加工得到一系列list(该list是动态生成的),从而根据时间的推移递增的得到一系列的字串。这个过程模拟了歌词的显示过程
接下来的SampleView继承了TextView并重载了onDraw方法.注意,这里只给了个sample,里面歌词怎么生成的见YOYOPlayer。这里就不给代码了
Java代码
importjava.io.File; importjava.util.List; importandroid.content.Context; importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.Paint; importandroid.graphics.Path; importandroid.graphics.Typeface; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.MotionEvent; importandroid.widget.TextView; importandroid.widget.Toast; importcom.android.lyric.Lyric; importcom.android.lyric.PlayListItem; importcom.android.lyric.Sentence; publicclassSampleViewextendsTextView{ privatePaintmPaint; privatefloatmX; privatestaticLyricmLyric; privatePathmPath; privatePaintmPathPaint; publicStringtest="test"; publicintindex=0; privateListlist; privatefloatmTouchStartY; privatefloatmTouchCurrY; publicfloatmTouchHistoryY; privateintmY; privatelongcurrentTime; privatelongcurrentDunringTime; privatelongsentenctTime; privatefloatmiddleY; privateStringmiddleContent="Empty"; privatestaticfinalintDY=30; privatestaticvoidmakePath(Pathp){ p.moveTo(10,0); p.cubicTo(100,-50,200,50,300,0); } publicSampleView(Contextcontext){ super(context); init(); } publicSampleView(Contextcontext,AttributeSetattr){ super(context,attr); init(); } publicSampleView(Contextcontext,AttributeSetattr,inti){ super(context,attr,i); init(); } privatevoidinit(){ setFocusable(true); PlayListItempli=newPlayListItem("","",1000L,true); mLyric=newLyric(newFile("/sdcard/M0005044007.lrc"),pli); list=mLyric.list; mPaint=newPaint(); mPaint.setAntiAlias(true); mPaint.setTextSize(20); mPaint.setTypeface(Typeface.SERIF); mPath=newPath(); makePath(mPath); mPathPaint=newPaint(); mPathPaint.setAntiAlias(true); mPathPaint.setColor(0x800000FF); mPathPaint.setStyle(Paint.Style.STROKE); } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); canvas.drawColor(Color.WHITE); Paintp=mPaint; floatx=mX; floatplus=currentDunringTime==0?index*30:index*30+(((float)currentTime-(float)sentenctTime)/(float)currentDunringTime)*(float)30; floaty=mY-plus+mTouchCurrY-mTouchStartY+mTouchHistoryY; canvas.translate(0,y); for(inti=0;i =middleY) middleContent=text; p.setTextAlign(Paint.Align.CENTER); canvas.drawText(text,x,0,p); //mY-mY/lines*(index-i) canvas.translate(0,DY); } } @Override protectedvoidonSizeChanged(intw,inth,intow,intoh){ super.onSizeChanged(w,h,ow,oh); mX=w*0.5f;//rememberthecenterofthescreen mY=h; middleY=h*0.5f; } @Override publicbooleanonTouchEvent(MotionEventevent){ floaty=event.getY(); switch(event.getAction()){ caseMotionEvent.ACTION_DOWN: mTouchHistoryY+=mTouchCurrY-mTouchStartY; mTouchStartY=mTouchCurrY=y; invalidate(); break; caseMotionEvent.ACTION_MOVE: mTouchCurrY=y; invalidate(); break; caseMotionEvent.ACTION_UP: Log.v("Lyriccontent",middleContent.length()+""); CharSequencechars=newCharSequence(){ @Override publiccharcharAt(intindex){ //TODOAuto-generatedmethodstub returnmiddleContent.charAt(index); } @Override publicintlength(){ //TODOAuto-generatedmethodstub returnmiddleContent.length(); } @Override publicCharSequencesubSequence(intstart,intend){ //TODOAuto-generatedmethodstub returnmiddleContent.subSequence(start,end); } @Override publicStringtoString(){ returnmiddleContent; } }; Toasttoast=Toast.makeText(SampleView.this.getContext(),chars,1000); toast.show(); invalidate(); break; } returntrue; } publicvoidupdateIndex(longtime){ this.currentTime=time; index=mLyric.getNowSentenceIndex(time); Sentencesen=list.get(index); currentDunringTime=sen.getDuring(); sentenctTime=sen.getFromTime(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。