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();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。