逗逼音乐播放器制作日志(一)<附源码>
我很喜欢编程,喜欢看到一个项目,从最初的几行代码慢慢变成好几个类,几千行代码.回头看看,这都是一个字母一个词语打出来的.就会觉得很开心...
曾经去报读过专业课程.可惜课程完毕后无缘成为一名码农,心里很是遗憾...现在记着的也不多了,不想就此放弃..于是决定制作一个简单的本地音乐播放器吧...之前已经写了点,网上参考了很多资料.希望各位大牛,多多指点...现在算是完成了3/1吧...我只能算是个半吊子,写不出什么精彩的代码..
非常可惜的是,我在写的时候没有将Service加入,导致现在只能前台播放..希望以后可以改进吧..
目前实现功能:
1,通过MediaStore工具读取手机中的全部音乐文件,并显示在一个ListView上;
2,通过GestureDetector手势管理器识别简单的用户手势操作.
如:左右滑动,点击,长按.播放器对不同操作做出不同的反馈;
3,SeekBar进度条控制音乐进度(这个非常简单);
4,实现:单曲循环,列表循环,随机播放,顺序播放,四种播放模式.(比较笨的办法实现的);
5,摇一摇随机换歌(抄微信摇一摇的);
下面是几个MusicActivity.class的代码:
1,四种播放模式同一按钮上:
//模式按钮被单击@OverridepublicvoidonClick(Viewv){if(mediaUtils.isPlay()){if(isLoop==false&&isAllLoop==false&&isShuff==false){//单曲循环button.setBackgroundResource(R.drawable.mediap_cycleone);isLoop=true;isAllLoop=false;isShuff=false;mediaUtils.loopPlay(isLoop);showTag("单曲循环");return;}elseif(isAllLoop==false&&isLoop==true&&isShuff==false){//列表循环button.setBackgroundResource(R.drawable.mediap_cycleall);isAllLoop=true;isLoop=false;isShuff=false;mediaUtils.loopPlay(isLoop);showTag("列表循环");return;}elseif(isShuff==false){button.setBackgroundResource(R.drawable.mediap_random);isShuff=true;mediaUtils.setShuff(isShuff);isLoop=false;isAllLoop=false;mediaUtils.loopPlay(isLoop);showTag("随机播放");return;}else{//恢复正常button.setBackgroundResource(R.drawable.mediap_order);isShuff=false;isLoop=false;isAllLoop=false;mediaUtils.loopPlay(isLoop);showTag("顺序播放");return;}}else{showTag("先选个歌听吧~~");}}个人觉得这个方式比较笨,但是又不会其他的方式,所以只能先这样了..主要就是根据不同条件(isLoop,isAllLoop,isShuff),让按钮加载不同的background.虽然功能可以用了,但是代码量大重复性高.希望大牛们能指点我一下.
下面贴上摇一摇的代码,网上有很多版本的,我觉得这个比较靠谱:
publicclassMusicShakeimplementsSensorEventListener{//传感器管理器privateSensorManagersensorManager=null;//传感器privateSensorsensor=null;//摇晃速率privatestaticfinalintSPEED_SHRESHOLD=3000;//两次摇晃间隔privatestaticfinalintUPTATE_INTERVAL_TIME=70;//感应器接口privateOnShakeListeneronShakeListener;//环境privateContextmContext;//三轴(水平,垂直,横向)privatefloatlastX;privatefloatlastY;privatefloatlastZ;//上次摇晃时间privatelonglastUpdateTime;//构造方法中初始化"环境"并获得感应器publicMusicShake(Contextcontext){this.mContext=context;Start();}//开始检测监听privatevoidStart(){//获得感应器服务sensorManager=(SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);if(sensorManager!=null){//获取重力感应器sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}//获取后注册感应器RegisterListener();}//注册privatevoidRegisterListener(){if(sensor!=null){//注册监听模式.我选择的是Game模式sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_GAME);}}//解除注册publicvoidunRegisterListener(){sensorManager.unregisterListener(this);}//绑定监听publicvoidsetOnShakeListener(OnShakeListeneronShakeListener){this.onShakeListener=onShakeListener;}//感应器接口publicinterfaceOnShakeListener{//实现方法voidOnShake();//~~~~~(要干的事情,其实是在引用类中实现);}@OverridepublicvoidonAccuracyChanged(Sensorarg0,intarg1){//TODOAuto-generatedmethodstub}@OverridepublicvoidonSensorChanged(SensorEventevent){//TODOAuto-generatedmethodstub//获取当前时间longcurrentUpdateTime=System.currentTimeMillis();//获取时间间隔longtimeInterval=currentUpdateTime-lastUpdateTime;if(timeInterval<UPTATE_INTERVAL_TIME)return;//初始化上一次的时间lastUpdateTime=currentUpdateTime;//获取初始三轴的数据floatx=event.values[0];floaty=event.values[1];floatz=event.values[2];//获取运动后三轴的数据floatdeltaX=x-lastX;floatdeltaY=x-lastY;floatdeltaZ=x-lastZ;//重置三轴数据lastX=x;lastY=y;lastZ=z;//网上抄的.doublespeed=Math.sqrt(deltaX*deltaX+deltaY*deltaY+deltaZ*deltaZ)/timeInterval*10000;Log.v("theLog","================"+speed+"================");//如果不是测试的话,请删掉上面这行log,因为它会不停的检测......//如果速率大于阀值,那么执行接口方法.if(speed>=SPEED_SHRESHOLD){onShakeListener.OnShake();}}
这是我网上看来的,没啥好说的,就是注释什么我自己写的,可能有不对的地方..
源码我贴在附件里面,因为是自己抽时间做的,BUG不知道得有多少.希望大家勿喷.
下一阶段准备实现的几点:
1,歌词;
2,Service;
3,网络功能(如果找得到资料的话);
差不多吧,这些对于我来说够忙活一段时间的了.嘿嘿.
最后,希望大家工作顺心,也祝我能找到一份码农的工作.
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。