您的位置:首页 > 其它

逗逼音乐播放器制作日志(一)<附源码>

2014-09-25 00:53 197 查看
我很喜欢编程,喜欢看到一个项目,从最初的几行代码慢慢变成好几个类,几千行代码.回头看看,这都是一个字母一个词语打出来的.就会觉得很开心...
曾经去报读过专业课程.可惜课程完毕后无缘成为一名码农,心里很是遗憾...现在记着的也不多了,不想就此放弃..于是决定制作一个简单的本地音乐播放器吧...之前已经写了点,网上参考了很多资料.希望各位大牛,多多指点...现在算是完成了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,网络功能(如果找得到资料的话);
差不多吧,这些对于我来说够忙活一段时间的了.嘿嘿.
最后,希望大家工作顺心,也祝我能找到一份码农的工作.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息