91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-25 18:34:19 來源:網絡 閱讀:515 作者: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

海安县| 辽中县| 辽宁省| 沾化县| 阿城市| 桐乡市| 阿拉善右旗| 民权县| 福清市| 固原市| 遵义市| 本溪市| 剑川县| 镶黄旗| 贵定县| 阜新| 红安县| 吉木萨尔县| 巫山县| 绥化市| 钟祥市| 钟山县| 卓资县| 娄烦县| 巴中市| 尼木县| 苗栗市| 仙居县| 竹山县| 溆浦县| 凤城市| 丰宁| 格尔木市| 富裕县| 大石桥市| 陵川县| 财经| 灌云县| 家居| 泸溪县| 金平|