美文网首页Android进阶之路Android技术知识
使用Android Studio给女神编写一个音乐盒

使用Android Studio给女神编写一个音乐盒

作者: 码农的地中海 | 来源:发表于2022-06-23 21:16 被阅读0次

    前言:

    这段时间,在网上看到一个好玩的软件。里面很简单,就是一个UI布局控件加上音乐。

    我们实验使用Android Studio中编写一个UI布局加上音乐代码,其主要功能包括:播放资源库中的音乐,可以上一首,下一首切换,能暂停,能重置。

    由此我们就可以实战做一个音乐盒发给女神!

    1.实际案例

    (1) 按钮排列

    image.png

    要点 :

    底部 + 水平居中 对齐属性 : 左边的LinearLayout的android:gravity 属性为bottom|center_horizontal;

    右部 + 垂直居中 对齐属性 : 右边的LinearLayout的android:gravity 属性为right|center_vertical;

    代码 :

    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    3.   android:layout_width="fill_parent" 
    4.   android:layout_height="fill_parent" 
    5.   android:orientation="vertical"  
    6.   android:gravity="bottom|center_horizontal"> 
    7.   <Button  
    8.     android:layout_width="wrap_content" 
    9.     android:layout_height="wrap_content" 
    10.     android:text="按钮1"/> 
    11.   <Button  
    12.     android:layout_width="wrap_content" 
    13.     android:layout_height="wrap_content" 
    14.     android:text="测试按钮2"/> 
    15.   <Button  
    16.     android:layout_width="wrap_content" 
    17.     android:layout_height="wrap_content" 
    18.     android:text="按钮3"/> 
    19.   <Button  
    20.     android:layout_width="wrap_content" 
    21.     android:layout_height="wrap_content" 
    22.     android:text="测试按钮4"/> 
    23.   <Button  
    24.     android:layout_width="wrap_content" 
    25.     android:layout_height="wrap_content" 
    26.     android:text="按钮5"/> 
    27. </LinearLayout> 
    

    子元素对齐 : 通过修改 android:gravity 属性来控制LinearLayout中子元素的排列情况;

    左边的图的属性为 bottom|center_horizontal , 右边的android:gravity的属性值为 right|center_vertical;

    (2) 三个按钮各自对齐

    三个水平方向的按钮, 分别左对齐, 居中对齐, 右对齐 :


    image.png

    要点 :

    水平线性布局 : 最顶层的LinearLayout的orientation是horizontal水平的;

    等分三个线性布局 : 第二层的LinearLayout的orientation是vertical垂直的, 并且宽度是fill_parent , 依靠权重分配宽度;

    设置按钮对齐方式 : 按钮的android:layout_gravity属性根据需求 left, center, right, 默认为left;

    代码 :

    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    3.   android:layout_width="fill_parent" 
    4.   android:layout_height="fill_parent" 
    5.   android:orientation="horizontal" > 
    6.    
    7.   <LinearLayout  
    8.     android:layout_width="fill_parent" 
    9.     android:layout_weight="1" 
    10.     android:layout_height="wrap_content" 
    11.     android:orientation="vertical" 
    12.     android:background="#f00"> 
    13.     <Button android:layout_width="wrap_content" 
    14.       android:layout_height="wrap_content" 
    15.       android:text="按钮1"/> 
    16.   </LinearLayout> 
    17.    
    18.   <LinearLayout  
    19.     android:layout_width="fill_parent" 
    20.     android:layout_weight="1" 
    21.     android:layout_height="wrap_content" 
    22.     android:orientation="vertical" 
    23.     android:background="#0f0"> 
    24.     <Button android:layout_width="wrap_content" 
    25.       android:layout_height="wrap_content" 
    26.       android:text="按钮2" 
    27.       android:layout_gravity="center"/> 
    28.   </LinearLayout> 
    29.    
    30.   <LinearLayout  
    31.     android:layout_width="fill_parent" 
    32.     android:layout_weight="1" 
    33.     android:layout_height="wrap_content" 
    34.     android:orientation="vertical" 
    35.     android:background="#00f"> 
    36.     <Button android:layout_width="wrap_content" 
    37.       android:layout_height="wrap_content" 
    38.       android:text="按钮3" 
    39.       android:layout_gravity="right"/> 
    40.   </LinearLayout> 
    41.    
    42. </LinearLayout> 
    

    我们可以按照上面的样子先搭建出这个功能的轮廓,当然我们需要首先在drowable底下添加我们需要用到的小图标。

    image.png

    2.添加音乐到资源文件夹中

    image.png

    点击Assets Folder,然后新建一个assets的资源文件夹,然后我们将已经下载好的音乐.mp3文件复制到这个文件夹下。


    image.png

    3.声明musicservice

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MusicService">
        </service>
    </application>
    

    我们在AndroidManifest.xml中声明.MusicService

    4.编写MainActivity和MusicService代码
    在MusicService类中,我们需要继承自Service,然后我们根据提示需要重写几个函数。

    public void onCreate()
    {
        am = getAssets();
        // 创建BroadcastReceiver
        serviceReceiver = new MyReceiver();
        // 创建IntentFilter
        IntentFilter filter = new IntentFilter();
        filter.addAction(MainActivity.CTL_ACTION);
        registerReceiver(serviceReceiver, filter);
        // 创建MediaPlayer
        mPlayer = new MediaPlayer();
        // 为MediaPlayer播放完成事件绑定监听器
        mPlayer.setOnCompletionListener(new OnCompletionListener() // ①
        {
            @Override
            public void onCompletion(MediaPlayer mp)
            {
                current++;
                if (current >= 3)
                {
                    current = 0;
                }
                //发送广播通知Activity更改文本框
                Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
                sendIntent.putExtra("current", current);
                // 发送广播,将被Activity组件中的BroadcastReceiver接收到
                sendBroadcast(sendIntent);
                // 准备并播放音乐
                prepareAndPlay(musics[current]);
            }
        });
        super.onCreate();
    }
    

    onCreate()函数的功能是和MainActivity进行广播通信,并实现音乐的播放功能。

    public class MyReceiver extends BroadcastReceiver
    {
    @Override
    public void onReceive(final Context context, Intent intent)
    {
        int control = intent.getIntExtra("control", -1);
        switch (control)
        {
            // 播放或暂停
            case 1:
                // 原来处于没有播放状态
                if (status == 0x11)
                {
                    // 准备并播放音乐
                    prepareAndPlay(musics[current]);
                    status = 0x12;
                }
                // 原来处于播放状态
                else if (status == 0x12)
                {
                    // 暂停
                    mPlayer.pause();
                    // 改变为暂停状态
                    status = 0x13;
                }
                // 原来处于暂停状态
                else if (status == 0x13)
                {
                    // 播放
                    mPlayer.start();
                    // 改变状态
                    status = 0x12;
                }
                break;
            // 停止声音
            case 2:
                // 如果原来正在播放或暂停
                if (status == 0x12 || status == 0x13)
                {
                    // 停止播放
                    mPlayer.stop();
                    status = 0x11;
                }
            //上一首切换
            case 3:
                if(current<=0){
                    mPlayer.stop();
                    current=musics.length-1;
                    prepareAndPlay(musics[current]);
                    status=0x12;
                }
            else {
                mPlayer.stop();
                current--;
                prepareAndPlay(musics[current]);
                status=0x12;
                }
            break;
            //下一首切换
            case 4:
                if(current>=2)
                {
                    mPlayer.stop();
                    current=0;
                    prepareAndPlay(musics[current]);
                    status=0x12;
                }
                else {
                    mPlayer.stop();
                    current++;
                    prepareAndPlay(musics[current]);
                    status=0x12;
                }
                break;
        }
        // 广播通知Activity更改图标、文本框
        Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
        sendIntent.putExtra("update", status);
        sendIntent.putExtra("current", current);
        // 发送广播,将被Activity组件中的BroadcastReceiver接收到
        sendBroadcast(sendIntent);
    }
    }
    

    以上重写的方法实现的功能就是播放,暂停,如果此时是暂停,点击按钮就变成播放,如果是播放,点击按钮就变成暂停,然后就是上一首和下一首音乐的切换,并且也要和MainActivity进行广播通信。

    在MainActivity中我们需要对四个按钮进行点击监听,并且需要创建和注册来自MusicService的通信的过滤器

        play.setOnClickListener(this);
        stop.setOnClickListener(this);
        pre.setOnClickListener(this);
        next.setOnClickListener(this);
          activityReceiver = new ActivityReceiver();
        // 创建IntentFilter
        IntentFilter filter = new IntentFilter();
        // 指定BroadcastReceiver监听的Action
        filter.addAction(UPDATE_ACTION);
        // 注册BroadcastReceiver
        registerReceiver(activityReceiver, filter);
        Intent intent = new Intent(this, MusicService.class);
        // 启动后台Service
        startService(intent);
    

    然后我们需要写一个ActivityReceiver类,来监听Service传回来的广播,当点击开始播放的按钮时,需要将图标变换成暂停,点击暂停时,需要将按钮变为播放,并且显示此时的歌名和歌手的名字。

    public class ActivityReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            // 获取Intent中的update消息,update代表播放状态
            int update = intent.getIntExtra("update", -1);
            // 获取Intent中的current消息,current代表当前正在播放的歌曲
            int current = intent.getIntExtra("current", -1);
            if (current >= 0)
            {
                title.setText(titleStrs[current]);
                author.setText(authorStrs[current]);
            }
            switch (update)
            {
                case 0x11:
                    play.setImageResource(R.drawable.play);
                    status = 0x11;
                    break;
                // 控制系统进入播放状态
                case 0x12:
                    // 播放状态下设置使用暂停图标
                    play.setImageResource(R.drawable.pause);
                    // 设置当前状态
                    status = 0x12;
                    break;
                // 控制系统进入暂停状态
                case 0x13:
                    // 暂停状态下设置使用播放图标
                    play.setImageResource(R.drawable.play);
                    // 设置当前状态
                    status = 0x13;
                    break;
            }
        }
    }
    

    接下来,我们需要重写一个点击监听函数Onclick():

    public void onClick(View source)
    {
        // 创建Intent
        Intent intent = new Intent("org.xr.action.CTL_ACTION");
        switch (source.getId())
        {
            // 按下播放/暂停按钮
            case R.id.play:
                intent.putExtra("control", 1);
                break;
            // 按下停止按钮
            case R.id.stop:
                intent.putExtra("control", 2);
                break;
            //按下上一首按钮
            case R.id.pre:
                intent.putExtra("control",3);
                break;
            //按下上一首按钮
            case R.id.next:
                intent.putExtra("control",4);
                break;
        }
        // 发送广播,将被Service组件中的BroadcastReceiver接收到
        sendBroadcast(intent);
    }
    

    这个函数的功能就是将点击按钮的信息转化成键值对,并用1,2,3,4四个值分别表示四种不同的点击意义,并将这四个键值对以广播的形式传递给MusicService,然后MusicService会根据传递来的键值对的值的信息来进行对音乐播放状态的改动。

    运行结果如下:


    QQ图片20220623205425.jpg

    文末

    这款简单的app,主要运用到UI布局和使用Android studio的简单使用;想学习更多Android开发可以获取以下资料:
    Android核心技术进阶手册、实战笔记

    女神收到这个app后都开心的哭了!

    相关文章

      网友评论

        本文标题:使用Android Studio给女神编写一个音乐盒

        本文链接:https://www.haomeiwen.com/subject/emmmvrtx.html