1. 程式人生 > >音心播放器 (MusicActivity-音樂播放頁面介面實現)

音心播放器 (MusicActivity-音樂播放頁面介面實現)

1.背景

   音樂播放頁面實現的功能有 :

   (1)當前歌曲的資訊

   (2)歌詞顯示

   (3)進度條顯示當前進度

   (4)倒計時

   (5)返回 和(下載或分享)

   (6)當前音樂的控制 :播放/暫停/下一曲/下一曲

   如下圖所示 :

                                                            

     這篇將實現整個介面的佈局;

2.佈局實現

   (1)整個模糊背景實現

             整個佈局,設定了一張背景圖片;

   (2)當前歌曲資訊

                                                              

              最主要的是它的背景顏色,在color.xml 中配置 顏色為 :其中55表示透明度,半透明狀態實現;   

 <color name="app_color_whrit">#55FCFCFC</color>
            

              總佈局為RelativeLayout :          

 <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="80dp"
                android:layout_marginTop="10dp"
                android:background="@color/app_color_whrit" >

                <ImageView
                    android:id="@+id/iv_music_songpic"
                    android:layout_width="80dp"
                    android:layout_height="match_parent"
                    android:layout_alignParentLeft="true"
                    android:scaleType="fitXY"
                    android:src="@drawable/moren_big" />

                <TextView
                    android:id="@+id/tv_music_songname"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="18dp"
                    android:layout_toRightOf="@+id/iv_music_songpic"
                    android:maxLines="2"
                    android:text="@string/list_item_song_name"
                    android:textColor="@color/text_color_black"
                    android:textSize="15sp" />

                <TextView
                    android:id="@+id/tv_music_singer"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:layout_marginBottom="10dp"
                    android:layout_marginRight="20dp"
                    android:text="@string/list_item_singer_name"
                    android:textColor="@color/app_color_zi"
                    android:textSize="12sp" />
            </RelativeLayout>

      (3)歌詞的實現是自定義View

               在這裡不分享歌詞的自定義View ,歌詞的顯示 在後面將要實現,因為內容稍微有點多。 

  <cn.labelnet.ui.LrcView
                    android:id="@+id/lrc"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:padding="5dp"
                    android:text="@string/music_song_ci"
                    lrc:animationDuration="1000"
                    lrc:currentTextColor="?attr/currentTextColor"
                    lrc:dividerHeight="24dp"
                    lrc:normalTextColor="@android:color/white"
                    lrc:textSize="16sp" />

        (4)控制實現

                                                                 

                 基本控制的實現,圖示在這裡就不分享了,自己可以在網上找到。

  <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="80dp"
                android:layout_marginTop="10dp"
                android:padding="10dp" >

                <ImageView
                    android:id="@+id/music_play"
                    android:layout_width="50dp"
                    android:layout_height="match_parent"
                    android:layout_centerInParent="true"
                    android:src="@drawable/pause" />

                <ImageView
                    android:id="@+id/music_next"
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:layout_centerInParent="true"
                    android:layout_marginLeft="20dp"
                    android:layout_toRightOf="@+id/music_play"
                    android:src="@drawable/next" />

                <ImageView
                    android:id="@+id/music_prev"
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:layout_centerInParent="true"
                    android:layout_marginRight="20dp"
                    android:layout_toLeftOf="@+id/music_play"
                    android:src="@drawable/prevers" />
            </RelativeLayout>


           (5)進度條/倒計時實現

                                                                        

                      倒計時和進度條實現,因為要同步歌曲的進度,所以內容也將單獨的寫一篇文章,敬請期待;

     <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="80dp"
                android:layout_marginTop="10dp"
                android:background="@color/app_color_whrit" >

                <ProgressBar
                    android:id="@+id/progressbar_music"
                    style="?android:attr/progressBarStyleHorizontal"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/tv_time_sheng"
                    android:layout_centerInParent="true"
                    android:max="100"
                    android:progress="50" />

                <TextView
                    android:id="@+id/tv_time_sheng"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentTop="true"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="@string/procress_1_23"
                    android:textColor="@color/app_color_zi" />

                <TextView
                    android:id="@+id/tv_time_all"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentTop="true"
                    android:layout_marginRight="10dp"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="@string/procress_1_23"
                    android:textColor="@color/app_color_zi" />
            </RelativeLayout>

3.歌曲資訊適配實現

    這裡使用了廣播(BoradCastReceiver )來實現,上面幾篇中已經使用了,當MusicActivity啟動的時候,傳送廣播到MusicService ,MusicService收到後,傳送廣播給MusicActivity ,進行初始化介面。這就是為什麼前面進行開始就啟動MusicService了吧。

    基本過程圖解 :


     (1)初始化基本過程如上圖所示,初始化流程。

     (2)有一個問題,在第一篇中不是說了,音樂專輯中沒有提供圖片,所以我們需要自己動手去搜索裡獲得圖片連結,在去請求圖片;

4.SDK網路請求封裝與圖解

   (1)首先實現NetRequest 介面,所有的showAPI SDK請求都來自它

public interface NetRequest {
	
	/**
	 * 網路請求介面 
	 */
	
	//請求字串
	String requestStringData();
	
	void requestStringData(int topid);
	
	void requestStringData(String keyword);
	
	void requestStringLrcData(String songId);
	
}

    (2)NetRequestImp中實現介面NetRequest ,但不寫方法內容,提供空方法
public class NetRequestImp implements NetRequest {

	/**
	 * 實現NetRequest介面,給想要實現方法的提供想要的方法
	 * 
	 */

	@Override
	public String requestStringData() {
		return null;
	}

	@Override
	public void requestStringData(int topid) {
		// 這裡給MusicRequest 提供此方法,在MusicRequest 中 重寫這個方法即可
	}
	
	@Override
	public void requestStringData(String keyword) {
	}

	@Override
	public void requestStringLrcData(String songId) {
		
	}
	
}

    (3)實現MusicRequest類 繼承自 NetRequestImp , 重寫使用的方法, 實現裡面的方法
/**
 * 音樂請求工具類 ShowAPi 提供的方法
 * 
 */
public class MusicRequest extends NetRequestImp {

	/**
	 *  音樂列表資訊
	 */
	private final String HOT_MUSIC_URL = "http://route.showapi.com/213-4";
	private final String SHOW_API_APPID = "xxxxx";
	private final String SHOW_API_SECRET = "xxxxx";
	
	/**
	 * 音樂id , 查詢資訊
	 */
	private final String SELECT_SONG_BY_KEYWORD_URL="http://route.showapi.com/213-1";
	
	/**
	 * 歌詞地址
	 */
	private final String GET_SONG_LRC_URL="http://route.showapi.com/213-2";
	
	
	
	ShowApiRequest apiRequest = null;
	// 提供非同步回撥方法
	private AsyncHttpResponseHandler musicAsyncHandler;

	public void setMusicAsyncHandler(AsyncHttpResponseHandler handler) {
		this.musicAsyncHandler = handler;
	}

	/**
	 * 熱門榜 : 資料請求
	 */
	@Override
	public void requestStringData(int topid) {
		new ShowApiRequest(HOT_MUSIC_URL, SHOW_API_APPID, SHOW_API_SECRET)
				.setResponseHandler(musicAsyncHandler)
				.addTextPara("topid", topid + "").post();
	}
	
	/**
	 *  關鍵字搜尋
	 */
	@Override
	public void requestStringData(String keyword) {
		new ShowApiRequest(SELECT_SONG_BY_KEYWORD_URL, SHOW_API_APPID, SHOW_API_SECRET)
        .setResponseHandler(musicAsyncHandler)
        .addTextPara("keyword", keyword)
        .addTextPara("page", "1")
        .post();
	}
	
	/**
	 * 獲取歌詞
	 */
	@Override
	public void requestStringLrcData(String songId) {
	    new ShowApiRequest(GET_SONG_LRC_URL ,SHOW_API_APPID,SHOW_API_SECRET)
        .setResponseHandler(musicAsyncHandler)
        .addTextPara("musicid",songId+"")
        .post();
	}
	
}

    (4)需要實現AsyncHandler ,單獨的實現該類,後使用回撥函式,將值回調出來;
public  class MusicAsyncHandler extends AsyncHttpResponseHandler {

	private MusicAsync mAsync;
	private List<MusicModel> mms = null;


	public void setMAsync(MusicAsync mAsync) {
		this.mAsync = mAsync;
		mms = new ArrayList<MusicModel>();
	}

	@Override
	public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
		// 失敗
		mAsync.onFail(arg3.getMessage() + " : " );
	}

	@Override
	public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
		// 成功
		String msg = "no msg";
		if (arg2.length > 0) {
			msg = new String(arg2);
			mms = StringUtil.getMusicList(msg);
			if(mms!=null){
				mAsync.onSuccess(mms);
			}else{
				msg="解析為null";
				mAsync.onFail(msg);
			}
		
		} else {
			mAsync.onFail(msg);
		}

	}

}

     (5)回撥介面 函式
public interface MusicAsync {

	//成功
	void onSuccess(List<MusicModel> mms);
	
	//失敗
	void onFail(String msg);
	
}


     (6)圖解

                    

5.總結

    播放頁面的實現,與MusciSerivce 通訊密切,同時還有Notification ,比如說 音樂暫停,播放頁面暫停後,通知欄上也要暫停;若控制通知欄上播放,那麼播放頁面既要同步歌曲資訊,也要保持進度進度一致性,時間一致性和狀態一致性。

相關推薦

播放 MusicActivity-音樂播放頁面介面實現

1.背景    音樂播放頁面實現的功能有 :    (1)當前歌曲的資訊    (2)歌詞顯示    (3)進度條顯示當前進度    (4)倒計時    (5)返回 和(下載或分享)    (6)當前音樂的控制 :播放/暫停/下一曲/下一曲    如下圖所示 :      

簡易音樂播放js,html,css實現

本人大專生一枚,這個也是本人作業之一,打算從此開始記錄自己的成長本播放器功能主要有:播放暫停,音樂進度,音樂進度計時,音量調節,快進退,重播,切換歌曲(本地歌曲)拖拉進度條播放(有時需要點多兩次目標位置,問題未知,猜測是定時呼叫衝突)主用函式:play(); pause();

22_Android中的本地音樂播放和網路音樂播放的編寫,本地視訊播放和網路視訊播放,照相機案例,偷拍案例實現

1 編寫以下案例:當點選了”播放”之後,在手機上的/mnt/sdcard2/natural.mp3就會播放。2 編寫佈局檔案activity_main.xml<LinearLayout xmlns

決策樹分類ID3、C4.5 Java實現

分類 什麼是分類?舉個例子,銀行貸款員需要分析資料,以便搞清楚哪些是貸款申請者是值得信賴的。通訊公司也希望能分清楚哪些客戶容易接受某一套餐,從而定向營銷。資料分類一般又包括學習階段(構建分類器)和分類階段(使用模型預測給定資料的類標號)。 決策樹分類器

Android實現音樂播放

simple ani call ket 打開文件 界面 方式 .cn 點擊 Graphical User Interface 本篇文章記錄了我實現Android簡單音樂播放器的過程,(一)中介紹了怎麽構建音樂播放器的前端頁面。首先大家看一下,界面最後是這樣的(界面有

QT5:C++實現基於Multimedia的音樂播放

播放列表 nbsp eight 自帶 讀取 set 技術 strong ati 前段時間C++課設,決定做個播放器,於是參考了網上的代碼後,做了個很簡陋的音樂播放器(只寫了MP3格式)出來,雖然功能甚少,但還是決定把過程記錄一下。 成品如下圖: 播放器功能: 上、下一首

QT5:C++實現基於multimedia的音樂播放

彈框 rem tooltip loop dialog ets posit list sch 今天接著上一篇來實現播放器的槽函數。 先來實現播放模式,槽函數如下: 1 //播放模式 2 void Music::musicPlayPattern() 3 { 4

用Vue來實現音樂播放十六:滾動列表的實現

com 作用 efault nor 大小 -s stylus BE ack 滾動列表是一個基礎組件 他是基於scroll組件實現的 在base文件夾下面創建一個list-view文件夾 裏面有list-view.vue組件 <template>

用Vue來實現音樂播放十八:右側快速入口點擊高亮

為我 UC 沒有 short cut this 必須 左右 png 問題一:當我們點擊右側快速入口的時候 被點擊的地方高亮 首先我們要知道右側快速入口是為什麽高亮??因為當watch()監控到scrollY的變化了的時候 將scrollY的值和listHeight相比較

用Vue來實現音樂播放:自動輪播圖啊

-s AR better hold ons ntp next start upd slider.vue組件的模板部分 <template> <div class="slider" ref="slider"> <div class=

Vue實現音樂播放:輪播圖組件

item [] tin neo pic () client link ons 輪播圖組件 <template> <div class="slider" ref="slider"> <div class="slider-

用Vue來實現音樂播放:歌單數據接口分析

QQ 插件 但是 之間 nbsp 跨域問題 前端 代理服務 一點 z這裏如果我們和之前獲取輪播圖的數據一樣來獲取表單的數據 發現根本獲取不到 原因是qq音樂在請求頭裏面加了authority和refer等 但是如果我們通過jsonp實現跨域

用Vue來實現音樂播放三十八:歌詞滾動列表的問題

vue 三十八 pla -s toggle 情況 TP 解決辦法 暫停 1、頻繁切換歌曲時,歌詞會跳來跳去 原因: // 歌詞跳躍是因為內部有一個currentLyric對像內部有一些功能來完成歌詞的跳躍 //每個currentLyric能實現歌曲的播放跳到相應的位置 是

用Vue來實現音樂播放四十:歌單詳情頁布局以及Vuex實現路由數據通訊

二級 font 利用 imp 實現 map color 音樂 image 1、歌單詳情頁是推薦頁面的二級路由頁面 將推薦頁面歌單的數據傳到歌曲詳情頁面 利用vuex 1、首先在state下定義一個歌單對象 disc{} 2、在mutaions

基於QT的網路音樂播放

自學Qt已經有一段時間了,但是始終感覺自己還是很弱(其實並不是感覺自己很弱,是自己本來就很弱,哈哈)。自己也照著書上敲了幾個例子,但覺得還是要寫點東西才能真正運用起來。所以,前段時間就寫了個很簡單的音樂播放器。在這裡總結一下,寫得不好,所以請各位不要介意。 先看

基於QT的網路音樂播放

得到AlbumID和FileHash後訪問http://www.kugou.com/yy/index.php?r=play/getdata&hash= &album_id= &_=1497972864535 其中hash後面跟的就是前面

基於QT的網路音樂播放

關於歌詞的顯示,其實我的主要思想就是解析歌詞部分的字串。歌詞顯示分為兩部分,一部分是播放器右側的歌詞顯示以及下面的桌面歌詞的顯示。其中桌面歌詞讓我很難受,想了很久,後面看到一個大佬的一篇文章後才有了思路。 先看效果圖: 其實就是解析lrc歌詞字串。lrc歌詞分

Android AIDL技術實戰專案-音樂播放

實現功能 使用AIDL服務實現: 音樂播放、暫停、上一曲、下一曲、歌詞功能 音樂播放模式:順序播放 、隨機播放、單曲播放 多個頁面呼叫AIDL服務 主頁面底部音樂迷你控制器 音樂詳情頁面 程式

個人專案——音樂播放

HomeActivity的程式碼: package com.wwj.sb.activity; import java.io.File; import java.util.ArrayList; import java.util.List; import android

Android AIDL技術實戰專案-音樂播放-使用retrofit完成音樂API的封裝

使用retrofit完成音樂API的封裝 程式碼結構 1、匯入retrofit相關庫 compile 'com.squareup.retrofit2:retrofit:2.2.0' 2、編寫介面API public interfac