我很喜欢编程,喜欢看到一个项目,从最初的几行代码慢慢变成好几个类,几千行代码.回头看看,这都是一个字母一个词语打出来的.就会觉得很开心...
曾经去报读过专业课程.可惜课程完毕后无缘成为一名码农,心里很是遗憾...现在记着的也不多了,不想就此放弃..于是决定制作一个简单的本地音乐播放器吧...之前已经写了点,网上参考了很多资料.希望各位大牛,多多指点...现在算是完成了3/1吧...我只能算是个半吊子,写不出什么精彩的代码..
非常可惜的是,我在写的时候没有将Service加入,导致现在只能前台播放..希望以后可以改进吧..
目前实现功能:
1,通过MediaStore工具读取手机中的全部音乐文件,并显示在一个ListView上;
2,通过GestureDetector手势管理器识别简单的用户手势操作.
如:左右滑动,点击,长按.播放器对不同操作做出不同的反馈;
3,SeekBar进度条控制音乐进度(这个非常简单);
4,实现:单曲循环,列表循环,随机播放,顺序播放,四种播放模式.(比较笨的办法实现的);
5,摇一摇随机换歌(抄微信摇一摇的);
下面是几个MusicActivity.class的代码:
1,四种播放模式同一按钮上:
// 模式按钮被单击 @Override public void onClick(View v) { 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; } else if (isAllLoop == false && isLoop == true && isShuff == false) {// 列表循环 button.setBackgroundResource(R.drawable.mediap_cycleall); isAllLoop = true; isLoop = false; isShuff = false; mediaUtils.loopPlay(isLoop); showTag("列表循环 "); return; } else if (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.虽然功能可以用了,但是代码量大重复性高.希望大牛们能指点我一下.
下面贴上摇一摇的代码,网上有很多版本的,我觉得这个比较靠谱:
public class MusicShake implements SensorEventListener { // 传感器管理器 private SensorManager sensorManager = null; // 传感器 private Sensor sensor = null; // 摇晃速率 private static final int SPEED_SHRESHOLD = 3000; // 两次摇晃间隔 private static final int UPTATE_INTERVAL_TIME = 70; // 感应器接口 private OnShakeListener onShakeListener; // 环境 private Context mContext; // 三轴(水平,垂直,横向) private float lastX; private float lastY; private float lastZ; // 上次摇晃时间 private long lastUpdateTime; // 构造方法中初始化"环境"并获得感应器 public MusicShake(Context context) { this.mContext = context; Start(); } // 开始检测监听 private void Start() { // 获得感应器服务 sensorManager = (SensorManager) mContext .getSystemService(Context.SENSOR_SERVICE); if (sensorManager != null) { // 获取重力感应器 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } // 获取后注册感应器 RegisterListener(); } // 注册 private void RegisterListener() { if (sensor != null) { // 注册监听模式.我选择的是Game模式 sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME); } } // 解除注册 public void unRegisterListener() { sensorManager.unregisterListener(this); } // 绑定监听 public void setOnShakeListener(OnShakeListener onShakeListener) { this.onShakeListener = onShakeListener; } // 感应器接口 public interface OnShakeListener { // 实现方法 void OnShake(); // ~~~~~(要干的事情,其实是在引用类中实现); } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub // 获取当前时间 long currentUpdateTime = System.currentTimeMillis(); // 获取时间间隔 long timeInterval = currentUpdateTime - lastUpdateTime; if (timeInterval < UPTATE_INTERVAL_TIME) return; // 初始化上一次的时间 lastUpdateTime = currentUpdateTime; // 获取初始三轴的数据 float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; // 获取运动后三轴的数据 float deltaX = x - lastX; float deltaY = x - lastY; float deltaZ = x - lastZ; // 重置三轴数据 lastX = x; lastY = y; lastZ = z; // 网上抄的. double speed = 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,网络功能(如果找得到资料的话);
差不多吧,这些对于我来说够忙活一段时间的了.嘿嘿.
最后,希望大家工作顺心,也祝我能找到一份码农的工作.