下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 带歌词的音乐播放器

带歌词的音乐播放器.doc

带歌词的音乐播放器

带着梦想去飞的小白
2017-11-23 0人阅读 举报 0 0 暂无简介

简介:本文档为《带歌词的音乐播放器doc》,可适用于活动策划领域

带歌词的音乐播放器山东建筑大学计算机科学与技术学院综合训练说明书题目:带歌词的音乐播放器课程:移动设备软件开发院(部):计算机科学与技术学院专业:软件工程专业班级:软件班学生姓名:刘超学号:指导教师:杨朝晖完成日期:目录带歌词的音乐播放器一、需求分析(系统功能需求(模块划分二、概要设计系统流程分析系统整体结构分析。三、详细设计音乐播放条目与音乐播放动态显示歌词模块扫描歌曲列表显示全部歌曲列表显示我的最爱列出储存歌曲的文件夹设置功能四、系统测试系统测试引言测试目的测试用例及结果测试结果分析五、总结参考文献带歌词的音乐播放器一需求分析现今社会生活紧张而欣赏音乐是其中最好的舒缓压力的方式之一本项目的目的是开发一个可以播放主流音乐文件格式的播放器本设计实现的主要功能是播放MpWav多种格式的音乐文件并且能够控制播放暂停停止播放列等基本播放控制功能界面简明操作简单。本项目是一款基于Android手机平台的音乐播放器使Android手机拥有个性的多媒体播放器使手机显得更生动灵活化与人们更为接近让手机主人随时随地处于音乐视频的旋律之中。使人们的生活更加多样化。也使设计者更加熟练Android的技术和其它在市场上的特点。(系统功能需求()音乐播放条目与音乐播放按截图要求构建音乐播放器的界面:,顶部设计音乐播放条目:,歌曲所在专辑的图片。,歌曲名称与演唱者。,播放按钮,底部设计音乐播放过程中用于显示歌词的文本视图。当用户点击播放按钮后音乐开始播放图片切换成暂停按钮。当用户点击暂停按钮后音乐暂停(非停止)图片切换成播放按钮。()动态显示歌词根据音乐播放的时间节点匹配歌词。如果歌词与当前播放节点吻合lyricView中呈现。()扫描歌曲自动获取手机中存放歌曲文件的文件夹用户勾选可能包含歌曲文件的文件夹选项当用户点击扫描歌曲的按钮时扫描勾选文件夹将扫描的歌曲加入歌曲列表()列表显示全部歌曲手机中扫描得到的全部歌曲用listview显示在界面中间当用户点击每一个列表项时弹出一个对话框提示几个选项包括从列表中移出从文件中移出查看歌曲信息。,界面下部依次出现的是歌曲专辑按钮歌曲信息上一首开始暂停下一首的图片按钮。()列表显示我的最爱当用户点击每一个列表项时弹出一个对话框提示几个选项包括从列表中移出从文件中移出查看歌曲信息。,界面下部依次出现的是歌曲专辑按钮歌曲信息上一首开始暂停下一首的图片按钮。在列表项底部显示共有多少首歌曲()列出储存歌曲的文件夹列表显示储存文件的文件夹都有哪些当用户点击某一个文件夹时列表显示每个文件夹内的所有歌曲()设置功能用户点击系统提供的图片进行背景更换用户点击系统提供的颜色更换歌词颜色(模块划分带歌词的音乐播放器全扫储音动我设部描存乐态的置歌歌文播显最选曲曲爱件放示项夹歌词二概要设计系统流程分析进入到音乐播放器内查看是否有音乐列表如果没有自动搜索歌曲并显示在列表界面中如果没有侧滑列表界面点击扫描歌曲接入扫描歌曲界面勾选文件夹点击扫描歌曲按钮将歌曲添加到歌曲列表中。添加完成后歌曲显示在列表中点击一个歌曲的列表项歌曲播放同时获取该专辑的图片以及歌曲名字以及歌手名字显示在列表下方然后点击item的下方的控件弹出一个对话框对话框中显示是否从列表中移出点击是移出否不进行任何操作返回文件列表。点击歌曲专辑图片跳转到歌曲播放界面界面中部动态显示歌词点击界面中的红心将歌曲标识为最爱点击下一曲按钮歌曲播放下一首。开始进入到APPN列表中是扫描歌曲列表否含有歌曲,Y文件夹是N勾选否勾选Y歌曲列表扫描歌曲点击歌曲列表中的一项播放歌曲N是否含搜索歌词有歌词,Y歌曲播放是否为最爱,点击上一曲是否为第一加入最爱列表首,点击下一曲是否为最后一曲,退出系统结束系统整体结构分析。用户点击app的图标进入到音乐播放器内查看是否有音乐列表如果没有自动搜索歌曲并显示在列表界面中如果没有侧滑列表界面点击扫描歌曲接入扫描歌曲界面勾选文件夹点击扫描歌曲按钮将歌曲添加到歌曲列表中。添加完成后歌曲显示在列表中点击一个歌曲的列表项歌曲播放同时获取该专辑的图片以及歌曲名字以及歌手名字显示在列表下方然后点击item的下方的控件弹出一个对话框对话框中显示是否从列表中移出点击是移出否不进行任何操作返回文件列表。点击歌曲专辑图片跳转到歌曲播放界面界面中部动态显示歌词点击界面中的红心将歌曲标识为最爱点击下一曲按钮歌曲播放下一首。点击上部返回按钮再次回到列表界面左侧滑界面进入到列表选择点击设置选项进入到设置界面点击更换界面背景及时更换界面背景点击更换歌词颜色及时更换歌词颜色。再次返回到列表选择界面点击我的最爱将显示我曾经标记为红心的歌曲列表点击文件夹将显示为我的手机内存放歌曲的相应的文件夹。点击退出按钮将退出该系统。三、详细设计音乐播放条目与音乐播放功能说明:按截图要求构建音乐播放器的界面:,顶部设计音乐播放条目:,歌曲所在专辑的图片。,歌曲名称与演唱者。,播放按钮,底部设计音乐播放过程中用于显示歌词的文本视图。,当用户点击播放按钮后音乐开始播放图片切换成暂停按钮。,当用户点击暂停按钮后音乐暂停(非停止)图片切换成播放按钮实现思路:利用xml文件布局实现的播放界面。设置了一个currentImage变量并开始赋值为每点击一次播放按钮currentImage加然后判断currentImage如果结果为零将图片转换为暂停按钮如果结果不为零将图片转换为播放按钮。代码:<LinearLayoutxmlns:android="android:layoutwidth="fillparent"android:layoutheight="fillparent"android:orientation="vertical"><LinearLayoutandroid:layoutwidth="fillparent"android:layoutheight="dip"android:orientation="horizontal"><ImageViewandroid:layoutwidth="dip"android:layoutheight="dip"android:src="drawablesuduo"android:scaleType="fitXY"><LinearLayoutandroid:layoutwidth="dp"android:layoutheight="dip"android:orientation="vertical"><Viewandroid:layoutwidth="wrapcontent"android:layoutheight="dip"><TextViewandroid:layoutwidth="wrapcontent"android:layoutheight="wrapcontentandroid:textColor="#FFFFFFFF"><Viewandroid:layoutwidth="wrapcontent"android:layoutheight="dip"><TextViewandroid:layoutwidth="wrapcontent"android:layoutheight="wrapcontentandroid:textColor="#FFFFFFFF"><LinearLayout><ImageButtonandroid:id="idstart"android:layoutwidth="matchparent"android:layoutheight="dip"android:scaleType="fitXY"android:src="drawablestart"><LinearLayout><comexamplelrcscrolldemoLyricViewandroid:id="idaudiolrc"android:layoutwidth="matchparent"android:layoutheight="fillparent"><LinearLayout>代码:if(currentImage==){startsetImageResource(Rdrawablestop)mppause()}else{startsetImageResource(Rdrawablestart)mpstart()running=truethread=newThread(newUIUpdateThread())threadstart()}currentImage}截图展示:动态显示歌词模块功能说明:根据音乐播放的时间节点匹配歌词。如果歌词与当前播放节点吻合lyricView中呈现。实现思路:重写了TextView先预将歌词存在lyricView中然后根据传进来的参数不断动态的滚动显示预先存在的歌词文件最后将lyricView将加入到布局文件中作为一个组件使用。开启一个新线程在线程中获取当前歌曲播放的具体位置并以参数的方式传入到相应的歌词处理类中动态的刷新歌词显示的视图。开始流程图:播放歌曲当前是否有歌曲播放,Y将歌曲位置传入匹配LRC文件N文件是否提示没有歌词去下载存在,Y在视图中显示代码:privateThreadthread=定义一个线程监听歌曲播放的位置开线程用于获取当前播放时间轴if(thread==){thread=newThread(newUIUpdateThread())threadstart()}if(!threadisAlive()){Systemoutprintln("~~~~~!threadisAlive()")running=falsethreadinterrupt()thread=thread=newThread(newUIUpdateThread())threadstart()}}classUIUpdateThreadimplementsRunnable{Overridepublicvoidrun(){while(running){if(!mpisPlaying()){running=falsethreadinterrupt()thread=}inttime=mpgetCurrentPosition()获取歌曲当前播放的位置位置是int型的intsleeptime=lyricViewupdateindex(time)将滚动歌词调整到与时间匹配的位置mHandlerpost(mUpdateResults)Systemoutprintln("mpisPlaying()~~~"time"!!"sleeptime"!!")if(sleeptime==)returntry{Threadsleep(sleeptime)}catch(Exceptione){eprintStackTrace()}}}}HandlermHandler=newHandler()RunnablemUpdateResults=newRunnable(){Overridepublicvoidrun(){lyricViewinvalidate()更新视图}}代码:publicclassLyricViewextendsTextView{privatePaintmPaintprivatefloatmXprivatePaintmPathPaintpublicintindex=publicfloatmTouchHistoryYprivateintmYprivateintcurrentDuringTime当前歌词持续时间middleYY轴中间privatefloatprivatefinalintDY=每一行的间隔publicfloatdriftxx偏移量publicfloatdriftyy偏移量privatefloatdriftrpublicbooleanshowprogress滑动时显示进度publicinttemp=publicLyricView(Contextcontext){super(context)init()}publicLyricView(Contextcontext,AttributeSetattr){super(context,attr)init()}publicLyricView(Contextcontext,AttributeSetattr,inti){super(context,attr,i)init()}privatevoidinit(){setFocusable(true)非高亮部分mPaint=newPaint()mPaintsetAntiAlias(true)mPaintsetTextSize()mPaintsetColor(ColorWHITE)mPaintsetTypeface(TypefaceSERIF)高亮部分当前歌词mPathPaint=newPaint()mPathPaintsetAntiAlias(true)mPathPaintsetTextSize())mPathPaintsetColor(ColorREDmPathPaintsetTypeface(TypefaceSANSSERIF)}protectedvoidonDraw(Canvascanvas){superonDraw(canvas)滑动相关显示进度相关intj=(int)(drifty)if(temp<j){temp}elseif(temp>j){temp}if(indextemp>=indextemp<timelength)driftr=driftycanvasdrawColor(xEFeffff)Paintp=mPaintPaintp=mPathPaintpsetTextAlign(PaintAlignCENTER)if(index==)returnpsetTextAlign(PaintAlignCENTER)先画当前行之后再画他的前面和后面这样就保持了当前行在中间的位置canvasdrawText(textindex,mX,middleYdriftr,p)if(showprogressindextemp<timelength){psetTextAlign(PaintAlignLEFT)if(indextemp>=){canvasdrawText(TimeParseTool(timeindextemp),MsecParseTime,middleY,p)}elsecanvasdrawText(":",,middleY,p)canvasdrawLine(,middleY,mX*,middleY,p)}floattempY=middleYdriftr画出本句之前的句子for(inti=indexi>=i){向上推移tempY=tempYDYif(tempY<){break}canvasdrawText(texti,mX,tempY,p)}tempY=middleYdriftr画出本句之后的句子for(inti=indexi<textlengthi){向下推移tempY=tempYDYif(tempY>mY){break}canvasdrawText(texti,mX,tempY,p)}}protectedvoidonSizeChanged(intw,inth,intow,intoh){superonSizeChanged(w,h,ow,oh)mX=w*f屏幕中心坐标(转换为float)mY=hmiddleY=h*f}***authoryounger*paramCurrentPosition*当前歌词的时间轴*returndrift*可以返回数据(已经废弃)*publicfloatupdateindex(intCurrentPosition){歌词数组的序号if(CurrentPosition>=IntegerparseInt(timeindex)CurrentPosition<IntegerparseInt(timeindex)){currentDuringTime=IntegerparseInt(timeindex)IntegerparseInt(timeindex)indexdrifty=driftx=}elseif(index==){currentDuringTime=IntegerparseInt(timeindex)}if(drifty>)drifty=(float)(drifty(currentDuringTime))if(index==)returnreturndrifty}publicbooleanrepair(){if(index<=){index=returnfalse}if(index>timelength)index=timelengthreturntrue}}截图展示:扫描歌曲功能介绍:自动获取手机中存放歌曲文件的文件夹用户勾选可能包含歌曲文件的文件夹选项当用户点击扫描歌曲的按钮时扫描勾选文件夹将扫描的歌曲加入歌曲列表实现思路:通过获取sd可得使用权限扫描手机中的所有歌曲显示在列表项中可以自定义勾选来扫描相应的文件夹。开始流程图:扫描列表是否已经勾勾选选,扫描歌曲代码:*扫描歌曲*authorlongdw(longdaweigmailcom)**publicclassMenuScanActivityextendsFragmentActivity{publicViewPagermViewPagerprivateList<Fragment>mFragmentList=newArrayList<Fragment>()OverrideprotectedvoidonCreate(Bundlearg){superonCreate(arg)setContentView(Rlayoutmenuscan)mViewPager=(ViewPager)findViewById(RidviewPager)initViewPager()}privatevoidinitViewPager(){FragmentleftFragment=newLeftFragment()FragmentrightFragment=newRightFragment()FragmentmenuFragment=newMenuScanFragment()mFragmentListadd(leftFragment)mFragmentListadd(menuFragment)mFragmentListadd(rightFragment)mViewPagersetAdapter(newMyPagerAdapter(getSupportFragmentManager(),mFragmentList))mViewPagersetOnPageChangeListener(newMyOnPageChangeListener())mViewPagersetCurrentItem(,true)*Handlerhandler=newHandler(){OverridepublicvoidhandleMessage(Messagemsg){superhandleMessage(msg)mViewPagersetCurrentItem(,true)}}handlersendEmptyMessageDelayed(,)*}privateclassMyPagerAdapterextendsFragmentPagerAdapter{List<Fragment>fragmentListpublicMyPagerAdapter(FragmentManagerfm){super(fm)}publicMyPagerAdapter(FragmentManagerfm,List<Fragment>fragments){super(fm)thisfragmentList=fragments}OverridepublicFragmentgetItem(intarg){returnfragmentListget(arg)}OverridepublicintgetCount(){returnfragmentListsize()}}privateclassMyOnPageChangeListenerimplementsOnPageChangeListener{intonPageScrolled=当滑动状态改变时调用OverridepublicvoidonPageScrollStateChanged(intarg){Systemoutprintln("onPageScrollStateChanged>"arg)if((onPageScrolled==||onPageScrolled==)arg==){setResult()finish()}}当当前页面被滑动时调用OverridepublicvoidonPageScrolled(intarg,floatarg,intarg){onPageScrolled=argSystemoutprintln("onPageScrolled>""arg="arg"arg="arg"arg="arg)}当新的页面被选中时调用OverridepublicvoidonPageSelected(intarg){Systemoutprintln("onPageSelected>"arg)}}OverridepublicvoidonBackPressed(){if(mViewPagerisShown()){mViewPagersetCurrentItem(,true)}}}截图演示:列表显示全部歌曲功能实现:手机中扫描得到的全部歌曲用listview显示在界面中间当用户点击每一个列表项时弹出一个对话框提示几个选项包括从列表中移出从文件中移出查看歌曲信息。,界面下部依次出现的是歌曲专辑按钮歌曲信息上一首开始暂停下一首的图片按钮。实现思路:将扫描的得到的全部歌曲显示在listview上然后自动以Adapter实现灵活适用于当前系统使用的适配器并在点击每个list项时出现一个对话框。流程图:扫描全部歌曲列表项显示各歌曲自定义Adapter实现对话框形式代码:publicclassMyAdapterextendsBaseAdapterimplementsIConstants{privateLayoutInflatermLayoutInflaterprivateArrayList<MusicInfo>mMusicListprivateServiceManagermServiceManagerprivateSlidingDrawerManagermSdmprivateintmPlayState,mCurPlayMusicIndex=privateIQueryFinishedmIQueryFinishedprivateFavoriteInfoDaomFavoriteDaoprivateMusicInfoDaomMusicDaoprivateintmFromclassViewHolder{TextViewmusicNameTv,artistTv,durationTvImageViewplayStateIconIv,favoriteIv}publicMyAdapter(Contextcontext,ServiceManagersm,SlidingDrawerManagersdm){mLayoutInflater=LayoutInflaterfrom(context)mMusicList=newArrayList<MusicInfo>()thismServiceManager=smthismSdm=sdmmFavoriteDao=newFavoriteInfoDao(context)mMusicDao=newMusicInfoDao(context)}publicvoidsetData(List<MusicInfo>list,intfrom){setData(list)thismFrom=from}***当数据库中有数据的时候会调用该方法来更新列表**paramlist*publicvoidsetData(List<MusicInfo>list){mMusicListclear()if(list!=listsize()>){mMusicListaddAll(list)为list排序Collectionssort(mMusicList,comparator)notifyDataSetChanged()}}publicvoidrefreshPlayingList(){if(mMusicListsize()>){mServiceManagerrefreshMusicList(mMusicList)}}publicvoidrefreshFavoriteById(intid,intfavorite){intposition=MusicUtilsseekPosInListById(mMusicList,id)mMusicListget(position)favorite=favoritenotifyDataSetChanged()}publicList<MusicInfo>getData(){returnmMusicList}publicvoidsetQueryFinished(IQueryFinishedfinish){mIQueryFinished=finish}Comparator<MusicInfo>comparator=newComparator<MusicInfo>(){charfirstl,firstrOverridepublicintcompare(MusicInfolhs,MusicInforhs){firstl=lhsmusicNamecharAt()firstr=rhsmusicNamecharAt()if(StringHelpercheckType(firstl)==StringHelperCharTypeCHINESE){firstl=StringHelpergetPinyinFirstLetter(firstl)}if(StringHelpercheckType(firstr)==StringHelperCharTypeCHINESE){firstr=StringHelpergetPinyinFirstLetter(firstr)}if(firstl>firstr){return}elseif(firstl<firstr){return}else{return}}}publicvoidsetPlayState(intplayState,intplayIndex){mPlayState=playStatemCurPlayMusicIndex=playIndexnotifyDataSetChanged()}OverridepublicintgetCount(){returnmMusicListsize()}OverridepublicMusicInfogetItem(intposition){returnmMusicListget(position)}OverridepubliclonggetItemId(intposition){returnposition}OverridepublicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){finalViewHolderviewHolderfinalMusicInfomusic=getItem(position)if(convertView==){viewHolder=newViewHolder()convertView=mLayoutInflaterinflate(Rlayout,)musiclistitemviewHoldermusicNameTv=(TextView)convertViewfindViewById(Ridmusicnametv)viewHolderartistTv=(TextView)convertViewfindViewById(Ridartisttv)viewHolderdurationTv=(TextView)convertViewfindViewById(Riddurationtv)viewHolderplayStateIconIv=(ImageView)convertViewfindViewById(Ridplaystateiv)viewHolderfavoriteIv=(ImageView)convertViewfindViewById(Ridfavoriteiv)convertViewsetTag(viewHolder){}elseviewHolder=(ViewHolder)convertViewgetTag()}if(position!=mCurPlayMusicIndex){viewHolderplayStateIconIvsetVisibility(ViewGONE)}else{viewHolderplayStateIconIvsetVisibility(ViewVISIBLE)if(mPlayState==MPSPAUSE){viewHolderplayStateIconIvsetBackgroundResource(Rdrawablelistpausestate)}else{viewHolderplayStateIconIvsetBackgroundResource(Rdrawablelistplaystate)}}viewHolderfavoriteIvsetOnClickListener(newViewOnClickListener(){OverridepublicvoidonClick(Viewv){if(musicfavorite==){if(mFrom==STARTFROMFAVORITE){mMusicListremove(position)notifyDataSetChanged()}musicfavorite=mFavoriteDaodeleteById(musicid)mMusicDaosetFavoriteStateById(musicid,)viewHolderfavoriteIvsetImageResource(Rdrawableiconfavouritenormal)mMusicListget(position)favorite=mSdmrefreshFavorite()}else{musicfavorite=mFavoriteDaosaveMusicInfo(music)mMusicDaosetFavoriteStateById(musicid,)viewHolderfavoriteIvsetImageResource(Rdrawableiconfavouritechecked)mMusicListget(position)favorite=mSdmrefreshFavorite()}}})截图展示:列表显示我的最爱功能实现:当用户点击每一个列表项时弹出一个对话框提示几个选项包括从列表中移出从文件中移出查看歌曲信息。,界面下部依次出现的是歌曲专辑按钮歌曲信息上一首开始暂停下一首的图片按钮。在列表项底部显示共有多少首歌曲实现思路:将扫描的得到的全部歌曲显示在listview上然后自动以Adapter实现灵活适用于当前系统使用的适配器并在点击每个list项时出现一个对话框。同时在每个歌曲界面都会设置一个心形图标点击后将歌曲加入到我的最爱中。流程图:播放歌曲是否加入最爱,Y加入最爱列表代码:protectedvoidonCreate(BundlesavedInstanceState){superonCreate(savedInstanceState)setContentView(Rlayoutplayqueue)initView()initConnection()}privatevoidinitConnection(){mServiceConnection=newServiceConnection(){OverridepublicvoidonServiceDisconnected(ComponentNamename){}OverridepublicvoidonServiceConnected(ComponentNamename,IBinderservice){mService=IMediaServiceStubasInterface(service)if(mService!=){try{mCurMode=mServicegetPlayMode()mPlayModeIvsetBackgroundResource(modeDrawablemCurMode)mServicegetMusicList(mMusicList)mCurMusicId=mServicegetCurMusicId()mPlayingSongPosition=MusicUtilsseekPosInListById(mMusicList,mCurMusicId)initListView()}catch(RemoteExceptione){eprintStackTrace()}}}}Intentintent=newIntent("comldwmusicserviceMediaService")bindService(intent,mServiceConnection,ContextBINDAUTOCREATE)}privatevoidinitView(){mListView=(ListView)findViewById(Ridlistviewplayqueue)mTitleTv=(TextView)findViewById(Ridtitletv)mListViewsetOnItemClickListener(this)mPlayModeIv=(ImageView)findViewById(Ridplaymodeiv)mPlayModeLayout=(LinearLayout)findViewById(Ridplaymodelayout)mPlayModeLayoutsetOnClickListener(newViewOnClickListener(){OverridepublicvoidonClick(Viewv){try{changeMode()mServicesetPlayMode(mCurMode)}catch(RemoteExceptione){eprintStackTrace()}}})}privatevoidchangeMode(){mCurModeif(mCurMode>MPMSINGLELOOPPLAY){mCurMode=MPMLISTLOOPPLAY}mPlayModeIvsetBackgroundResource(modeDrawablemCurMode)}截图展示:列出储存歌曲的文件夹功能说明:列表显示储存文件的文件夹都有哪些当用户点击某一个文件夹时列表显示每个文件夹内的所有歌曲实现思路:通过获取sd的权限扫描手机并将含有歌曲的文件夹先出出来流程图:扫描手机中文件夹是否含有歌曲,加入到列表中代码:publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflaterinflate(Rlayoutmenuscanfragment,container,false)mScanBtn=(Button)viewfindViewById(RidscanBtn)mBackBtn=(ImageButton)viewfindViewById(RidbackBtn)mScanBtnsetOnClickListener(this)mBackBtnsetOnClickListener(this)mHandler=newHandler(){OverridepublicvoidhandleMessage(Messagemsg){superhandleMessage(msg)mProgressdismiss()((MenuScanActivity)getActivity())mViewPagersetCurrentItem(,true)}}returnview}privatevoidgetData(){newThread(newRunnable(){Overridepublicvoidrun(){mHelperdeleteTables(getActivity())MusicUtilsqueryMusic(getActivity(),STARTFROMLOCAL)MusicUtilsqueryAlbums(getActivity())MusicUtilsqueryArtist(getActivity())MusicUtilsqueryFolder(getActivity())mHandlersendEmptyMessage()}})start()}OverridepublicvoidonClick(Viewv){if(v==mScanBtn){mProgress=newProgressDialog(getActivity())mProgresssetMessage("正在扫描歌曲请勿退出软件~")mProgresssetCancelable(false)mProgresssetCanceledOnTouchOutside(false)mProgressshow()getData()}elseif(v==mBackBtn){((MenuScanActivity)getActivity())mViewPagersetCurrentItem(,true)}}}截图展示:设置功能功能说明:用户点击系统提供的图片进行背景更换用户点击系统提供的颜色更换歌词颜色实现思路:跳转到设置界面预先将背景图片和歌词颜色存放在系统文件内用户通过点击使系统将歌词或背景进行切换。流程图:设置界面是否更未更换背景图片换背景,背景更换成功代码:publicclassMenuSettingActivityextendsFragmentActivity{publicViewPagermViewPagerprivateList<Fragment>mFragmentList=newArrayList<Fragment>()OverrideprotectedvoidonCreate(Bundlearg){superonCreate(arg)setContentView(Rlayoutmenusetting)mViewPager=(ViewPager)findViewById(RidviewPager)initViewPager()}privatevoidinitViewPager(){FragmentleftFragment=newLeftFragment()FragmentrightFragment=newRightFragment()FragmentmenuFragment=newMenuSettingFragment()mFragmentListadd(leftFragment)mFragmentListadd(menuFragment)mFragmentListadd(rightFragment)mViewPagersetAdapter(newMyPagerAdapter(getSupportFragmentManager(),mFragmentList))mViewPagersetOnPageChangeListener(newMyOnPageChangeListener())mViewPagersetCurrentItem(,true)*Handlerhandler=newHandler(){OverridepublicvoidhandleMessage(Messagemsg){superhandleMessage(msg)mViewPagersetCurrentItem(,true)}}handlersendEmptyMessageDelayed(,)*}privateclassMyPagerAdapterextendsFragmentPagerAdapter{List<Fragment>fragmentListpublicMyPagerAdapter(FragmentManagerfm){super(fm)}publicMyPagerAdapter(FragmentManagerfm,List<Fragment>fragments){super(fm)thisfragmentList=fragments}OverridepublicFragmentgetItem(intarg){returnfragmentListget(arg)}OverridepublicintgetCount(){returnfragmentListsize()}}privateclassMyOnPageChangeListenerimplementsOnPageChangeListener{intonPageScrolled=当滑动状态改变时调用OverridepublicvoidonPageScrollStateChanged(intarg){Systemoutprintln("onPageScrollStateChanged>"arg)if((onPageScrolled==||onPageScrolled==)arg==){finish()}}截图展示:四、系统测试系统测试引言软件测试是保证软件质量的关键是对需求分析和编码的最后复审。在开发软件的过程中虽使用了许多保证软件质量的方法分析、设计和实现软件但难免还会在实际操作过程中犯错误。这样就会在软件产品中隐藏许多错误和缺陷。如果不在设计阶段排除这些错误有可能导致系统功能不能正常运行有时候甚至会造成巨大的损失。为了保证软件的质量且在今后的使用过程中保证软件的精确性、安全性和较长的使用寿命软件必须进行充分的测试。为此在对本系统经过测试之后写下了如下的分析报告。测试目的编写本测试计划的目的是对设计的系统的性能进行测试以满足客户的需求看系统的最终设计是否和我们最初要实现的功能相一致找出系统存在的缺点和不足不断完善系统的功能。测试用例及结果音乐播放界面测试:动态显示歌词测试:扫描歌词界面测试:全部歌曲列表测试:我的最爱列表测试:文件夹功能测试:设置界面测试:测试结果分析测试结果还算正常一切都可以正确运行不过仍然有一点小八哥就是在播放器暂停后再次播放音乐会有歌词暂时无法正常显示不过已经解决了只需在按钮的事件监听时再次重新启动更新歌词的线程就可以同步了。五、总结通过本次课程设计我独自完成了带歌词的音乐播放器的安卓程序在设计本课程设计中我遇到了很多的困难刚开始时我根本就不了解音乐播放器是怎样实现的于是通过上网查资料和向别人寻求帮助的方式渐渐的了解了什么是音乐播放器以及音乐播放器的架构但是在具体的编写程序时还是遇到了各种困难比如如何实现歌词与歌曲的同步播放按钮的图片切换以及如何获取音乐文件并使用音乐文件等等。慢慢我懂得了如何去做实现歌词与歌曲的同步需要开启一个新的线程并不断地向这个线程中传入当前歌曲位置参数不断地动态刷新歌词同时歌词的处理我是重新定义了TextView类实现动态滚动歌词并将同步的歌词设置为红色。在课设中我遇到了很多问题但正是因为这些问题我同样学到了很多的知识我学会了如何开启新的子线程学会如何自定义View类等等。同时也感谢老师以及热心同学对我的热情指导才让我能够完成这次课程设计。参考文献刘宝林Java程序设计与案例高等教育出版社刘韬楼兴华SQLServer数据库系统开发实例导航北京:人民邮电出版社丁宝康董健全数据库实验教程北京:清华大学出版社MicheleLerouxBustamantsSecureyourASPNETAppsandWCFserviceswithWindowsCardSpaceMSDNMagazine,April肖建编ASPNET编程实例与技巧集粹北京:北京希望电子出版社巴兹拉等ASPNET安全性高级编程北京:清华大学出版社

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/49

带歌词的音乐播放器

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利