遇到女生生日,不得准备生日礼物,刚好在学Android,顺便写了一个Dome给她当生日礼物。(很简单的而已,不喜勿喷)
Android Studio是Google旗下的一款软件,它可以使用Java、Kotlin、以及C++开发。当然了,Java开发是现在的潮流,但Kotlin开发才是未来。我这使用了Java开发,还是用熟悉的语言写起来得心应手。
&emspAndroid Studio是有官方教程的,比较方便。
安卓发展这么多年了,教程和错误都很完备了,学会百度,幸福一生。Android Studio安装教程
该教程是很老的版本,但八九不离十,变化不大,有问题可以联系本作者,免费解答。
安装和界面介绍就不写了,别人都有。直接开始代码吧。
哦,对,还有效果
点击按钮会跳转到下一个Activity,那个时钟是实时显示时间的,算一个创新点。
点击那个surprise会跳转到bilibili,当然了,你也可以跳到其他APP或网页。
首先,我们打开Android Studio,新建一个project
可以看到有很多的模板,我们选择Empty Activity,当然也可以选择No Activity,不过有点麻烦。
点击Next,可以看到下面的情况,
1、这里是你的project的名字,遵循C语言起名规则
2、这里是你的Dome的存储路径,不可以有中文,有中文那个finish不会亮,不信你试试。
3、这里选Java,你选Kotlin的话也没问题,语言只是工具嘛。
4、这里是你安装的SDK,相当于一个解释器,没有的话要检查一下你的安装包是不是少了什么东西,还是出了什么问题,一般按照官方的安装是没有问题的。
点击Finish,就有以下界面了。
点一下右上角的小三角,运行一波,就会发现,报错,还提示你要装什么东西。对,这个测试需要安卓手机,但你又不想用自己的手机怎么搞?那就用Android Studio自带的虚拟机。
安装虚拟机的教程在下面的链接虚拟机安装教程
啥都装好后,就可以写Dome了。(其实可以运行一下,其实你再创建project的时候就已经写了一个Dome了,当然了,是最简单的Hello world,-)
在这里我新建了两个Activity和一个Java,和添加了一个依赖。是不是很简单。
我们来认识一下各个重要的文件。
.java文件用来写功能的,实现各个控件的功能,其实不难。
这里的drawable一般都是用来存储图片和动图的
layout是页面布局,.xml文件都是布局文件,就跟UI设计一样,不过使用代码实现的。
最后就是添加依赖的地方了。这里有很大用处,各种炫酷的东西都要在这里添加依赖。
好了,多点点就会了,点错了就重开咯,又不是毕业设计。
写APP先学会写按键,毕竟,按键贯穿整个APP,这里只介绍两种按键类型。
1、按键的外观设计
这里使用了最普通的按键设计,你也可以搞的花里胡哨的,实用就行。花里胡哨只需在百度一搜就好了,也可以问问chatgpt。
先有表面的东西才能搞内在的东西,先设计布局在实现其功能。
我们在layout.xml里添加以下代码,布局要改为相对布局,我觉得这个比较方便。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:ignore="ExtraText,MissingClass">
//。。。。。。。。。。在这中间添加控件
</RelativeLayout>
有按键才能跟用户互动嘛,再加点小图片和文字,搞的漂漂亮亮的,女孩子才会喜欢嘛。
<!--文本框-->
//这里就是添加了文字,祝你生日快乐!斜体
<TextView
android:id="@+id/text01"
android:layout_margin="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="italic" //这个就是斜体,软件自带的
android:text="祝你生日快乐!"
android:textColor="@android:color/holo_red_light" //文字颜色:亮红色
android:textSize="25dp" />//文字大小
//同理可得
<TextView
android:id="@+id/text02"
android:layout_margin="90dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="italic"
android:text="送给****"
android:textColor="@android:color/holo_red_light"
android:textSize="25dp" />
<TextView //这里是给一个时钟做准备的,不喜欢的话也可以不要,还是挺难的
android:id="@+id/tvTime"
android:layout_toRightOf="@id/text01"
android:layout_marginTop="20dp"
android:layout_marginLeft="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="italic"
android:text=" "
android:textColor="@android:color/holo_purple"
android:textSize="25dp" />
<!--图片展示控件-->
//这里就是添加图片的地方,可以添加女生的照片或者其他照片,得而不得,不失为一种美好。
<ImageView
android:id="@+id/image01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="200dp"
android:layout_marginBottom="41dp"
android:src="@drawable/img" />
<!--按钮控件-->
//按键模块,用来跳转到另一个activity的
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_alignParentBottom="true"
android:layout_centerVertical="true"
android:layout_marginTop="10dp"
android:layout_marginBottom="41dp"
android:text="请点击此按钮" /> //文字可以改一改
第一个Activity布局已经写完了,同理第二个Activity的布局也是一样的,新建Activity就不说了,这个自行摸索。
接下来就是实现Activity之间的跳转、Activity到网站的跳转和背景音乐的设置。
先来看第一个Activity之间的跳转。
setContentView(R.layout.activity_main);
// 获取控件id
Button btn1 = findViewById(R.id.btn);
// 监听点击事件
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 跳转到另一个名为ButtonActivity的界面
Intent intent=new Intent(MainActivity.this,MainActivity2.class);
startActivity(intent);
}
}
);
这里使用了一个按键监听,基础操作就不多说了,复制修改就好了。
接下来就是Activity跳转到网站。
setContentView(R.layout.activity_main2);
Btn2 = findViewById(R.id.btn01);
final Uri uri=Uri.parse("https://www.bilibili.com/" +
"video/BV1ab411n7no/" +
"?share_source=copy_web&vd_source=50c79c9ca19b953130a4988502bded45");
Btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}
});
这个其实跟Activity之间的跳转非常像,只是将跳转的对象换成了网站。关键字:`final Uri uri=Uri.parse
`最后就是背景音乐的设置。
// 启动服务播放背景音乐
Intent intent = new Intent(MainActivity.this, MyIntentService.class);
String action = MyIntentService.ACTION_MUSIC;
// 设置action
intent.setAction(action);
startService(intent);
还要新建一个.java文件来实现音乐的播放,当然,你也可以在Activity里写,不过代码太长不建议这样写,而且后期的模块化学习无益。
package com.example.happybirthday;
import android.app.IntentService;
import android.content.Intent;
import android.media.MediaPlayer;
import android.util.Log;
/**
* An {@link IntentService} subclass for handling asynchronous task requests in
* a service on a separate handler thread.
*
* TODO: Customize class - update intent actions and extra parameters.
*/
public class MyIntentService extends IntentService {
// TODO: Rename actions, choose action names that describe tasks that this
// IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
public static final String ACTION_FOO = "com.example.bouzouki.demobilising.action.FOO";
public static final String ACTION_BAZ = "com.example.bouzouki.demobilising.action.BAZ";
// action声明
public static final String ACTION_MUSIC = "com.example.bouzouki.demobilising.action.music";
// TODO: Rename parameters
public static final String EXTRA_PARAM1 = "com.example.bouzouki.demobilising.extra.PARAM1";
public static final String EXTRA_PARAM2 = "com.example.bouzouki.demobilising.extra.PARAM2";
// 声明MediaPlayer对象
private MediaPlayer mediaPlayer;
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String action = intent.getAction();
if (ACTION_FOO.equals(action)) {
final String param1 = intent.getStringExtra(EXTRA_PARAM1);
final String param2 = intent.getStringExtra(EXTRA_PARAM2);
handleActionFoo(param1, param2);
} else if (ACTION_BAZ.equals(action)) {
final String param1 = intent.getStringExtra(EXTRA_PARAM1);
final String param2 = intent.getStringExtra(EXTRA_PARAM2);
handleActionBaz(param1, param2);
}
// 根据intent设置的action来执行对应服务的操作
if (ACTION_MUSIC.equals(action)){
handleActionMusic();
}
}
}
/**
* 该服务执行的操作用来播放背景音乐
*/
private void handleActionMusic() {
if (mediaPlayer == null){
// 根据音乐资源文件创建MediaPlayer对象 设置循环播放属性 开始播放
mediaPlayer = MediaPlayer.create(this, R.raw.bd_02);
mediaPlayer.setLooping(true);
mediaPlayer.start();
}
}
/**
* Handle action Foo in the provided background thread with the provided
* parameters.
*/
private void handleActionFoo(String param1, String param2) {
// TODO: Handle action Foo
throw new UnsupportedOperationException("Not yet implemented");
}
/**
* Handle action Baz in the provided background thread with the provided
* parameters.
*/
private void handleActionBaz(String param1, String param2) {
// TODO: Handle action Baz
throw new UnsupportedOperationException("Not yet implemented");
}
}
再把音乐.mp3复制到raw里就好了,再修改一下音乐文件名字。
最后就是时间的设置:
先在这里添加以下代码
implementation 'com.google.android.gms:play-services-auth:20.5.0'
添加依赖
最后就是添加实现代码,覆盖掉之前的空白text
timer = new Timer();//创建timer对象
tvTime=findViewById(R.id.tvTime);
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.v("Timer","run()...");
mCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));
int hour = mCalendar.get(Calendar.HOUR_OF_DAY);//HOUR 进制为12小时 HOUR_OF_DAY 为24小时
int minute = mCalendar.get(Calendar.MINUTE);//分钟
int second = mCalendar.get(Calendar.SECOND) + 1;//秒数
if (second == 60) {
minute += 1;
second = 0;
}
if (minute == 60){
hour += 1;
minute = 0;
}
if (hour == 12){
hour = 0;
}
@SuppressLint("DefaultLocale") String time = String.format("%d:%02d:%02d", hour, minute, second);
mCalendar.set(Calendar.SECOND, second);
mCalendar.set(Calendar.MINUTE, minute);
mCalendar.set(Calendar.HOUR_OF_DAY, hour);
Message message=new Message();
message.what=0;
message.obj=time;
mHandler.sendMessage(message);
}
},0,1000);
}
@SuppressLint("HandlerLeak")
Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
Log.v("Timer","handleMessage()..");
super.handleMessage(msg);
String str=(String)msg.obj;
tvTime.setText(str);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if(timer!=null){
timer.cancel();//关闭timer
}
这样就写完了,是不是非常简单,礼轻情意重,快去跟你爱的人说声生日快乐吧。
礼物虽简易,但人情亦珍贵,好好珍惜眼前人。