首頁 > 軟體

Android Studio實現音樂播放器的全過程(簡單易上手)

2022-02-11 13:00:22

前言

我們大家平時長時間打程式碼的時候肯定會感到疲憊和乏味,這個時候一邊播放自己喜歡的音樂,一邊繼續打程式碼,心情自然也愉快很多。音樂帶給人的聽覺享受是無可比擬的,動聽的音樂可以愉悅人的身心,讓人更加積極地去熱愛生活。大家平常應該會用QQ音樂、網易雲音樂或者酷狗音樂等音樂APP來聽歌,想不想擁有屬於自己的音樂播放器。那麼接下來就教大家如何用Android Studio自己製作一個音樂播放器APP。

一、專案概述

1、需求分析

綜合運用UI介面設計、資料儲存、Activity(活動)、Service(服務)、MusicPlayer、ListView等知識,設計開發一款具有音樂列表的音樂播放器。

2、設計分析

整個專案包含五個類和五個佈局檔案:

其中frag1、frag2為java檔案,

MusicActivity為Activity檔案,

MusicService為Service檔案,

MainActivity為專案建立時自動生成的Activity檔案。

activity_main為MainActivity的佈局檔案,顯示執行APP時的主介面。

activity_music為MusicActivity的佈局檔案,顯示音樂播放器介面。

music_list和item_layout一起組成frag1的佈局檔案,

就是音樂列表介面(開啟APP預設顯示音樂列表介面)。

frag2_layout就是frag2的佈局檔案,主要顯示的是專輯封面圖片。

3、資原始檔分析

在res資料夾下建立了raw資料夾,放了三首音樂檔案,在drawable資料夾中貼上了音樂封面圖片bg.jpg和播放器背景圖片music_bg.jpg,還有背景選擇器的btn_bg_selector.xml檔案,如圖所示:

二、開發環境

三、準備工具

1、選擇幾首自己下載好的音樂檔案,命名為music0、music1、music2等,這裡歌曲都要是mp3型別的,數量隨意。歌曲名的下標是從0開始的,因為程式碼中我設定的url地址是從0開始的,否則會閃退。

2、選擇每首歌對應的歌手圖片,剪成圓形並且儲存好,命名為music0、music1、music2等。

圖片一定要剪成圓形,橢圓會影響執行效果,導致閃退,如果不太清楚圖片如何剪成圓形,可以拉到文末學習。

3、準備一張音樂播放器的背景圖片,命名為music_bg,再找一張圖片用作專輯圖片,命名為bg。

四、詳細設計

1、搭建主介面佈局

首先開啟Android Studio,並新建一個工程,File——>New——>New Project——>Empty Project,工程名稱叫做Music_List。

包名自己隨意設定,這裡博主用的是zj.dzh;工程檔案的儲存路徑要修改一下,不要放在C槽,博主這裡選擇的是放在E槽的一個Projects資料夾中,養成專案統一放在英文路徑下的好習慣。

最後選擇API 18:Android 4.3,因為這樣它就擁有了99.5%的跨平臺性(相容性非常好),因為它版本很低,基本上模擬器API版本都是高於20的,所以這個軟體可以執行其他各種裝置上。點選Finish完成建立。

設計一個app的時候,一定要先設計layout檔案,再設計java檔案,因為佈局有了,才能在上面進行程式碼的編寫。我們來看一下activity_main佈局檔案,它主要顯示主介面。什麼是主介面,就是一個APP執行後預設顯示的介面。

最外層用的是LinearLayout線性佈局,然後設定的是垂直排列。裡面放了兩個小的LinearLayout,分別是最上面的一個TextView,內容設定的是“我喜歡”,接著第二個小的LinearLayout放兩個水平的TextView控制元件,內容顯示的是“歌曲”和“專輯”。

最下面的剩餘空間全部給了Fragment,它的id是content,這裡不知道Fragment沒關係,反正就曉得它和TextView一樣可以顯示內容就行。效果如圖:

Fragment是一種可以嵌入在活動中的UI片段,能夠讓程式更加合理和充分地利用大螢幕的空間,出現的初衷是為了適應大螢幕的平板電腦,可以將其看成一個小型Activity,又稱作Activity片段。

完整程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="我喜歡"
            android:textSize="35dp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    <TextView
        android:id="@+id/menu1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="歌曲"
        android:textSize="25dp"/>
    <TextView
        android:id="@+id/menu2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="專輯"
        android:textSize="25dp"/>
    </LinearLayout>
    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="9">
    </FrameLayout>

</LinearLayout>

然後回到我們的Activity檔案。MainActivity類是整個工程的主類,首先建立需要用到的控制元件,然後繫結控制元件,再設定監聽器,底部導航欄設定的是兩個選單檔案:frag1(歌曲選單)和frag2(專輯選單),預設情況下展示frag1歌曲選單,點選切換顯示frag2專輯選單。程式碼如下:

package zj.dzh.music_list;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //建立需要用到的控制元件的變數
    private TextView tv1,tv2;
    private FragmentManager fm;
    private FragmentTransaction ft;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //繫結控制元件
            tv1=(TextView)findViewById(R.id.menu1);
            tv2=(TextView)findViewById(R.id.menu2);
            //設定監聽器,固定寫法
            tv1.setOnClickListener(this);
            tv2.setOnClickListener(this);
            //若是繼承FragmentActivity,fm=getFragmentManger();
            fm=getSupportFragmentManager();
            //fm可以理解為Fragment顯示的管理者,ft就是它的改變者
            ft=fm.beginTransaction();
            //預設情況下就顯示frag1
            ft.replace(R.id.content,new frag1());
            //提交改變的內容
            ft.commit();
    }
    @Override
    //控制元件的點選事件
    public void onClick(View v){
        ft=fm.beginTransaction();
        //切換索引標籤
        switch (v.getId()){
            case R.id.menu1:
                ft.replace(R.id.content,new frag1());
                break;
            case R.id.menu2:
                ft.replace(R.id.content,new frag2());
                break;
            default:
                break;
        }
        ft.commit();
    }
}

2、建立服務類

2.1、服務概述

2.2、服務的建立

建立MusicService檔案,右擊包名——>New——>Service——>Service,如圖:

命名為MusicService,然後Finish。

2.3、服務的啟動方式

2.4、服務的生命週期

MusicService程式碼:

package zj.dzh.music_list;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;

import java.util.Timer;
import java.util.TimerTask;
//這是一個Service服務類
public class MusicService extends Service {
    //宣告一個MediaPlayer參照
    private MediaPlayer player;
    //宣告一個計時器參照
    private Timer timer;
    //建構函式
    public MusicService() {}
    @Override
    public  IBinder onBind(Intent intent){
        return new MusicControl();
    }
    @Override
    public void onCreate(){
        super.onCreate();
        //建立音樂播放器物件
        player=new MediaPlayer();
    }
    //新增計時器用於設定音樂播放器中的播放進度條
    public void addTimer(){
        //如果timer不存在,也就是沒有參照範例
        if(timer==null){
            //建立計時器物件
            timer=new Timer();
            TimerTask task=new TimerTask() {
                @Override
                public void run() {
                    if (player==null) return;
                    int duration=player.getDuration();//獲取歌曲總時長
                    int currentPosition=player.getCurrentPosition();//獲取播放進度
                    Message msg= MusicActivity.handler.obtainMessage();//建立訊息物件
                    //將音樂的總時長和播放進度封裝至bundle中
                    Bundle bundle=new Bundle();
                    bundle.putInt("duration",duration);
                    bundle.putInt("currentPosition",currentPosition);
                    //再將bundle封裝到msg訊息物件中
                    msg.setData(bundle);
                    //最後將訊息傳送到主執行緒的訊息佇列
                    MusicActivity.handler.sendMessage(msg);
                }
            };
            //開始計時任務後的5毫秒,第一次執行task任務,以後每500毫秒(0.5s)執行一次
            timer.schedule(task,5,500);
        }
    }
    //Binder是一種跨程序的通訊方式
    class MusicControl extends Binder{
        public void play(int i){//String path
                Uri uri=Uri.parse("android.resource://"+getPackageName()+"/raw/"+"music"+i);
                try{
                    //重置音樂播放器
                    player.reset();
                    //載入多媒體檔案
                    player=MediaPlayer.create(getApplicationContext(),uri);
                    player.start();//播放音樂
                    addTimer();//新增計時器
                }catch(Exception e){
                e.printStackTrace();
            }
        }
        //下面的暫停繼續和退出方法全部呼叫的是MediaPlayer自帶的方法
        public void pausePlay(){
            player.pause();//暫停播放音樂
        }
        public void continuePlay(){
            player.start();//繼續播放音樂
        }
        public void seekTo(int progress){
            player.seekTo(progress);//設定音樂的播放位置
        }
    }
    //銷燬多媒體播放器
    @Override
    public void onDestroy(){
        super.onDestroy();
        if(player==null) return;
        if(player.isPlaying()) player.stop();//停止播放音樂
        player.release();//釋放佔用的資源
        player=null;//將player置為空
    }
}

3、搭建音樂播放介面佈局

右擊包名,新建一個Activity,命名為MusicActivity,點選Finish,它會生成一個activity_music檔案,用來顯示音樂播放介面,如圖所示:

(1)MusicActivity類:通過onClick方法控制著音樂的播放、暫停、繼續播放和退出功能。它和MusicService進行繫結連線。在音樂播放時顯示歌曲總時長,還有歌曲當前播放時長,控制歌曲進度條的移動。程式碼如下:

package zj.dzh.music_list;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.animation.ObjectAnimator;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;

import static java.lang.Integer.parseInt;

public class MusicActivity extends AppCompatActivity implements View.OnClickListener{
    //進度條
    private static SeekBar sb;
    private static TextView tv_progress,tv_total,name_song;
    //動畫
    private ObjectAnimator animator;
    private MusicService.MusicControl musicControl;
    private String name;
    private Intent intent1,intent2;
    private MyServiceConn conn;
    //記錄服務是否被解綁,預設沒有
    private boolean isUnbind =false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music);
        //獲取從frag1傳來的資訊
        intent1=getIntent();
        init();
    }
    private void init(){
        //進度條上小綠點的位置,也就是當前已播放時間
        tv_progress=(TextView)findViewById(R.id.tv_progress);
        //進度條的總長度,就是總時間
        tv_total=(TextView)findViewById(R.id.tv_total);
        //進度條的控制元件
        sb=(SeekBar)findViewById(R.id.sb);
        //歌曲名顯示的控制元件
        name_song=(TextView)findViewById(R.id.song_name);
        //繫結控制元件的同時設定點選事件監聽器
        findViewById(R.id.btn_play).setOnClickListener(this);
        findViewById(R.id.btn_pause).setOnClickListener(this);
        findViewById(R.id.btn_continue_play).setOnClickListener(this);
        findViewById(R.id.btn_exit).setOnClickListener(this);

        name=intent1.getStringExtra("name");
        name_song.setText(name);
        //建立一個意圖物件,是從當前的Activity跳轉到Service
        intent2=new Intent(this,MusicService.class);
        conn=new MyServiceConn();//建立服務連線物件
        bindService(intent2,conn,BIND_AUTO_CREATE);//繫結服務
        //為滑動條新增事件監聽,每個控制元件不同果然點選事件方法名都不同
        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            //這一行註解是保證API在KITKAT以上的模擬器才能順利執行,也就是19以上
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                //進當滑動條到末端時,結束動畫
                if (progress==seekBar.getMax()){
                    animator.pause();//停止播放動畫
                }
            }

            @Override
            //滑動條開始滑動時呼叫
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            @Override
            //滑動條停止滑動時呼叫
            public void onStopTrackingTouch(SeekBar seekBar) {
                //根據拖動的進度改變音樂播放進度
                int progress=seekBar.getProgress();//獲取seekBar的進度
                musicControl.seekTo(progress);//改變播放進度
            }
        });
        //宣告並繫結音樂播放器的iv_music控制元件
        ImageView iv_music=(ImageView)findViewById(R.id.iv_music);
        String position= intent1.getStringExtra("position");
        //praseInt()就是將字串變成整數型別
        int i=parseInt(position);
        iv_music.setImageResource(frag1.icons[i]);
        //rotation和0f,360.0f就設定了動畫是從0°旋轉到360°
        animator=ObjectAnimator.ofFloat(iv_music,"rotation",0f,360.0f);
        animator.setDuration(10000);//動畫旋轉一週的時間為10秒
        animator.setInterpolator(new LinearInterpolator());//勻速
        animator.setRepeatCount(-1);//-1表示設定動畫無限迴圈
    }
    //handler機制,可以理解為執行緒間的通訊,我獲取到一個資訊,然後把這個資訊告訴你,就這麼簡單
    public static Handler handler=new Handler(){//建立訊息處理器物件
        //在主執行緒中處理從子執行緒傳送過來的訊息
        @Override
        public void handleMessage(Message msg){
            Bundle bundle=msg.getData();//獲取從子執行緒傳送過來的音樂播放進度
            //獲取當前進度currentPosition和總時長duration
            int duration=bundle.getInt("duration");
            int currentPosition=bundle.getInt("currentPosition");
            //對進度條進行設定
            sb.setMax(duration);
            sb.setProgress(currentPosition);
            //歌曲是多少分鐘多少秒鐘
            int minute=duration/1000/60;
            int second=duration/1000%60;
            String strMinute=null;
            String strSecond=null;
            if(minute<10){//如果歌曲的時間中的分鐘小於10
                strMinute="0"+minute;//在分鐘的前面加一個0
            }else{
                strMinute=minute+"";
            }
            if (second<10){//如果歌曲中的秒鐘小於10
                strSecond="0"+second;//在秒鐘前面加一個0
            }else{
                strSecond=second+"";
            }
            //這裡就顯示了歌曲總時長
            tv_total.setText(strMinute+":"+strSecond);
            //歌曲當前播放時長
            minute=currentPosition/1000/60;
            second=currentPosition/1000%60;
            if(minute<10){//如果歌曲的時間中的分鐘小於10
                strMinute="0"+minute;//在分鐘的前面加一個0
            }else{
                strMinute=minute+" ";
            }
            if (second<10){//如果歌曲中的秒鐘小於10
                strSecond="0"+second;//在秒鐘前面加一個0
            }else{
                strSecond=second+" ";
            }
            //顯示當前歌曲已經播放的時間
            tv_progress.setText(strMinute+":"+strSecond);
        }
    };
    //用於實現連線服務,比較模板化,不需要詳細知道內容
    class MyServiceConn implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service){
            musicControl=(MusicService.MusicControl) service;
        }
        @Override
        public void onServiceDisconnected(ComponentName name){

        }
    }
    //判斷服務是否被解綁
    private void unbind(boolean isUnbind){
        //如果解綁了
        if(!isUnbind){
            musicControl.pausePlay();//音樂暫停播放
            unbindService(conn);//解綁服務
        }
    }
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_play://播放按鈕點選事件
                String position=intent1.getStringExtra("position");
                int i=parseInt(position);
                musicControl.play(i);
                animator.start();
                break;
            case R.id.btn_pause://暫停按鈕點選事件
                musicControl.pausePlay();
                animator.pause();
                break;
            case R.id.btn_continue_play://繼續播放按鈕點選事件
                musicControl.continuePlay();
                animator.start();
                break;
            case R.id.btn_exit://退出按鈕點選事件
                unbind(isUnbind);
                isUnbind=true;
                finish();
                break;
        }
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        unbind(isUnbind);//解綁服務
    }
}

(2)activity_music: 顯示音樂播放器介面,包括圖片轉動,歌曲名傳值,還有播放、暫停播放、繼續播放和退出四個控制按鈕。效果如圖:

activity_music程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/music_bg"
    tools:context=".Music_Activity"
    android:gravity="center"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/iv_music"
        android:layout_width="240dp"
        android:layout_height="240dp"
        android:layout_gravity="center_horizontal"
        android:layout_margin="15dp"
        android:src="@drawable/music0"/>
    <TextView
        android:id="@+id/song_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="歌曲名"
        android:textSize="20sp"/>
    <SeekBar
        android:id="@+id/sb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="8dp"
        android:paddingRight="8dp">
        <TextView
            android:id="@+id/tv_progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="00:00"/>
        <TextView
            android:id="@+id/tv_total"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="00:00"/>
    </RelativeLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_play"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_margin="8dp"
            android:layout_weight="1"
            android:background="@drawable/btn_bg_selector"
            android:text="播放音樂"/>
        <Button
            android:id="@+id/btn_pause"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_margin="8dp"
            android:layout_weight="1"
            android:background="@drawable/btn_bg_selector"
            android:text="暫停播放"/>
        <Button
            android:id="@+id/btn_continue_play"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_margin="8dp"
            android:layout_weight="1"
            android:background="@drawable/btn_bg_selector"
            android:text="繼續播放"/>
        <Button
            android:id="@+id/btn_exit"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_margin="8dp"
            android:layout_weight="1"
            android:background="@drawable/btn_bg_selector"
            android:text="退出"/>
    </LinearLayout>

</LinearLayout>

(3)右擊drawable資料夾,New——>Drawable Resource File,命名為btn_bg_selector,如圖:

該檔案為按鈕顏色選擇器,是當播放等按鈕按下的時候變成灰色,未按下顯示白色。程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="10dp"/>
            <solid android:color="#d4d4d4"/>
        </shape>
    </item>
    <item android:state_pressed="false">
        <shape android:shape="rectangle">
            <corners android:radius="10dp"/>
            <solid android:color="#ffffff"/>
        </shape>
    </item>
</selector>

4、搭建音樂列表介面佈局

右擊包名——>New——>Java Class,命名為frag1,點選OK。如圖:

(1)frag1類:顯示歌曲列表,手機模擬器執行出來的預設介面,就是將歌曲名、歌曲圖片以列表的形式顯示出來,註釋很詳細,程式碼如下:

package zj.dzh.music_list;

import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

public class frag1 extends Fragment {
    private View view;
    //建立歌曲的String陣列和歌手圖片的int陣列
    public String[] name={"鄧紫棋——光年之外","蔡健雅——紅色高跟鞋","Taylor Swift——Love Story"};
    public static int[] icons={R.drawable.music0,R.drawable.music1,R.drawable.music2};
    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        //繫結佈局,只不過這裡是用inflate()方法
        view=inflater.inflate(R.layout.music_list,null);
        //建立listView列表並且繫結控制元件
        ListView listView=view.findViewById(R.id.lv);
        //範例化一個介面卡
        MyBaseAdapter adapter=new MyBaseAdapter();
        //列表設定介面卡
        listView.setAdapter(adapter);
        //列表元素的點選監聽器
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //建立Intent物件,引數就是從frag1跳轉到MusicActivity
                Intent intent=new Intent(frag1.this.getContext(), MusicActivity.class);
                //將歌曲名和歌曲的下標存入Intent物件
                intent.putExtra("name",name[position]);
                intent.putExtra("position",String.valueOf(position));
                //開始跳轉
                startActivity(intent);
            }
        });
        return view;
    }
    //這裡是建立一個自定義介面卡,可以作為模板
    class MyBaseAdapter extends BaseAdapter{
        @Override
        public int getCount(){return  name.length;}
        @Override
        public Object getItem(int i){return name[i];}
        @Override
        public long getItemId(int i){return i;}

        @Override
        public View getView(int i ,View convertView, ViewGroup parent) {
            //繫結好VIew,然後繫結控制元件
            View view=View.inflate(frag1.this.getContext(),R.layout.item_layout,null);
            TextView tv_name=view.findViewById(R.id.item_name);
            ImageView iv=view.findViewById(R.id.iv);
            //設定控制元件顯示的內容,就是獲取的歌曲名和歌手圖片
            tv_name.setText(name[i]);
            iv.setImageResource(icons[i]);
            return view;
        }
    }

}

(2)右擊layout資料夾——>New———>Layout Resource File,新建兩個layout檔案,分別命名為music_list和item_layout,這兩個佈局檔案和frag1對應,顯示歌曲列表。如圖所示:

music_list:歌曲列表佈局檔案,和QQ好友列表功能相同,垂直顯示多條記錄。效果如圖:

music_list程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

item_layout: 就是條目佈局,和上面的music_list列表一起組合使用,它就是相當於列表中每一行的佈局,佈局效果如圖:

item_layout程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerVertical="true"/>
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/iv"
        android:layout_centerVertical="true">
        <TextView
            android:id="@+id/item_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="歌曲"
            android:textSize="15sp"
            android:textColor="#000000"/>
    </RelativeLayout>
</RelativeLayout>

5、搭建專輯介面佈局

右擊包名,New——>Java Class,命名為frag2,點選OK。如圖:

(1)frag2類:展示的封面專輯圖片,在主介面點選專輯按鈕跳轉到此介面。程式碼如下:

package zj.dzh.music_list;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.Fragment;

public class frag2 extends Fragment {
    //建立一個View
    private View zj;
    //顯示佈局
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        zj = inflater.inflate(R.layout.frag2_layout, null);
        return zj;
    }
}

(2)再新建一個layout檔案,命名為frag2_layout,如圖:

frag2_layout用來設定一個ImageView,顯示專輯圖片,程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/zj"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/bg"/>

</LinearLayout>

當然frag2可以自由發揮,比如說設定成歌手資料、MV列表或者排行榜等等。

6、匯入資原始檔

在res資料夾下新建一個raw資料夾,將剛剛準備好的音樂檔案複製貼上到raw資料夾中。對應的封面圓形圖片、背景圖片和專輯圖片都複製貼上到drawable中,這裡博主只選擇了三首歌曲和三張封面圓形圖片,歌曲數量由大家自己設定,沒有限制。

再次提醒下,注意命名哦;mp3歌曲檔案在Android中開啟是亂碼,不用擔心,也不需要開啟它。

至此,完整的音樂播放器專案建立完成。

五、專案效果

1、建立模擬器

選擇自己的模擬器執行,如果沒有模擬器可以點選AVD,選擇新建模擬器:

選擇高於API 21的版本進行下載,如圖:

2、執行演示

(1)執行手機模擬器,顯示主介面:

(2)點選專輯索引標籤:

(3)再選擇歌曲索引標籤,選擇第一首歌《光年之外》並開啟,跳轉到音樂播放頁面,歌手的封面圖片顯示在正中間,發現《光年之外》的歌名也傳遞過來了:

(4)點選播放音樂按鈕,音樂開始播放,進度條開始滑動,圖片開始旋轉:

(5)點選暫停播放按鈕,音樂停止播放,而且進度條停止滑動,圖片也停止旋轉:

(6)點選繼續播放按鈕,音樂繼續播放,歌手圖片也繼續旋轉:

(7)點選退出按鈕,會退回到主介面:

(8)選擇第二首歌《紅色高跟鞋》並播放,這裡進度條可以自由拖動,歌曲也會隨之播放到對應位置:

(9)選擇第三首歌《Love Story》並播放:

執行效果和功能很完整,至此完成了音樂播放器的實現,喜歡的朋友們可以自己動手做一下,放上自己喜歡的愛豆照片,還有喜歡的歌,體驗感真的不要太好!

六、專案總結

這次音樂播放器工程,可以讓大家熟練掌握Android程式開發的基本技術,涉及Android 基礎知識、UI介面、資料儲存、四大元件、網路程式設計、高階程式設計等。大家熟練掌握可以對以後的Android開發有很大的幫助。

附如何將圖片剪成圓形

1、將要裁剪的圖片(寬高一致的矩形圖片)複製到WPS檔案中:

2、點選右邊豎排工具列中的裁剪圖片選項,如圖:

3、選擇橢圓選項(矩陣圖片剪出來就是圓形),如圖:

4、點選上方工具列中的裁剪選項,圖片裁剪成圓形:

5、右擊圓形區域,點選另存為圖片,將圖片儲存到本地使用。

到此這篇關於Android Studio實現音樂播放器的文章就介紹到這了,更多相關Android Studio實現音樂播放器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com