Android进阶之路Android技术知识

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

2022-06-23  本文已影响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后都开心的哭了!

上一篇 下一篇

猜你喜欢

热点阅读