您好,登錄后才能下訂單哦!
我很喜歡編程,喜歡看到一個項目,從最初的幾行代碼慢慢變成好幾個類,幾千行代碼.回頭看看,這都是一個字母一個詞語打出來的.就會覺得很開心...
曾經去報讀過專業課程.可惜課程完畢后無緣成為一名碼農,心里很是遺憾...現在記著的也不多了,不想就此放棄..于是決定制作一個簡單的本地音樂播放器吧...之前已經寫了點,網上參考了很多資料.希望各位大牛,多多指點...現在算是完成了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,網絡功能(如果找得到資料的話);
差不多吧,這些對于我來說夠忙活一段時間的了.嘿嘿.
最后,希望大家工作順心,也祝我能找到一份碼農的工作.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。