温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-25 18:34:19 来源:网络 阅读:514 作者:Momo陈小白 栏目:开发技术

    我很喜欢编程,喜欢看到一个项目,从最初的几行代码慢慢变成好几个类,几千行代码.回头看看,这都是一个字母一个词语打出来的.就会觉得很开心...

    曾经去报读过专业课程.可惜课程完毕后无缘成为一名码农,心里很是遗憾...现在记着的也不多了,不想就此放弃..于是决定制作一个简单的本地音乐播放器吧...之前已经写了点,网上参考了很多资料.希望各位大牛,多多指点...现在算是完成了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,网络功能(如果找得到资料的话);

差不多吧,这些对于我来说够忙活一段时间的了.嘿嘿.

最后,希望大家工作顺心,也祝我能找到一份码农的工作.

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI