文章目录
MyTool 工具界面:秒表计时
♦ 回顾
通过上一节的学习,我们实现了工具界面手电筒功能的实现,如下图所示。今天,要在这个界面中实现一个新的功能秒表计时。
♦ 设置 activity_my_tool.xml 界面
- 添加一个新的
按钮组件
:秒表
<Button
android:id="@+id/timecount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="250dp"
android:text="秒表"
android:textSize="16dp"/>
♦ 编写 MyToolActivity 实现功能界面跳转
public class MyToolActivity extends AppCompatActivity {
TextView welcome;
Button net, call, quick_call,flashlight,timecount;
//权限请求:载入界面、特定情况触发
//定义权限 --- 动态权限,申请哪一个就启动哪一个,通常为常量
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.CALL_PHONE
};
//请求状态码
private static int REQUEST_PERMISSION_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_tool);
.........................
// 获取工具组件
net = findViewById(R.id.net);
call = findViewById(R.id.call);
quick_call = findViewById(R.id.quick_call);
flashlight = findViewById(R.id.flashlight);
timecount = findViewById(R.id.timecount);
.........................
// 秒表界面跳转
timecount.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建页面跳转
Intent intent = new Intent();
intent.setClass(MyToolActivity.this,TimeCountActivity.class);
startActivity(intent);
}
});
}
}
♦ 创建 activity_time_count.xml 秒表界面
- 基本布局、背景
- 添加计时显示、开始、暂停、重置按钮组件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.myapplication.TimeCountActivity"
android:background="@drawable/main_page">
<TextView
android:id="@+id/textView2" 标题
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginStart="176dp"
android:layout_marginLeft="176dp"
android:layout_marginTop="100dp"
android:text="秒 表"
android:textStyle="bold"
android:textSize="20dp"
android:textColor="@android:color/white"/>
<Chronometer 秒表计时显示器 --- 这个组件没找到,直接手打
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginStart="129dp"
android:layout_marginLeft="129dp"
android:layout_marginTop="183dp"
android:layout_marginBottom="98dp"
android:text="01:00"
android:textColor="@android:color/white"
android:textSize="60dp" />
<Button 开始
android:id="@+id/begin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="35dp"
android:layout_marginLeft="35dp"
android:layout_marginBottom="240dp"
android:text="开始" />
<Button
android:id="@+id/stop" 暂停
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginEnd="161dp"
android:layout_marginRight="161dp"
android:layout_marginBottom="240dp"
android:text="暂停" />
<Button 重置
android:id="@+id/restart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="35dp"
android:layout_marginRight="35dp"
android:layout_marginBottom="240dp"
android:text="重置" />
</RelativeLayout>
♦ 编写 TimeCountActivity 实现功能
- 在Android的SDK中,为我们提供了一个计时器,这个计时器称为Chronometer。(具体功能)
- Vibrator手机震动
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.Vibrator;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import com.example.myapplication_test.R;
public class TimeCountActivity extends AppCompatActivity {
// 创建组件对象
Button begin,stop,restart;
Chronometer chronometer; // 计时器
Vibrator vibrator; // 手机震动
long waitTime; // 流失的时间
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_time_count);
// 获取组件
begin = findViewById(R.id.begin);
stop = findViewById(R.id.stop);
restart = findViewById(R.id.restart);
chronometer = findViewById(R.id.chronometer);
// 获取震动
vibrator = (Vibrator)this.getSystemService(VIBRATOR_SERVICE);
// begin 开始时可以停止,重置、开始不可点
begin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 计时开始
chronometer.start();
// 设置按钮
begin.setEnabled(false);
stop.setEnabled(true);
restart.setEnabled(false);
// 开始后,如果点了暂停,还要接着计时,就“继续”
begin.setText("继续");
// 实际上计时器上显示的时间
// SystemClock.elapsedRealtime() 返回系统启动到现在的毫秒数,包含休眠时间。
// chronometer.setBase() 设置计时器的时间,一开始waitTime=0,所以就是现实真实的计时时间
chronometer.setBase(SystemClock.elapsedRealtime()-waitTime);
}
});
// stop 停止时,可以继续,也可以重置,但不可以再次停止
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 暂停计时
chronometer.stop();
// 设置按钮
begin.setEnabled(true);
stop.setEnabled(false);
restart.setEnabled(true);
// 暂停后,计时器停止,浪费的时间 = 下一次操作开始(系统启动到现在的时间毫秒数) - 暂停时计时器上的时间
waitTime = SystemClock.elapsedRealtime() - chronometer.getBase();
}
});
// 重置后只能开始
restart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 重新开始时,浪费的时间归零,需要重新计算
waitTime = 0;
// 设置按钮
begin.setEnabled(true);
begin.setText("开始");
stop.setEnabled(false);
restart.setEnabled(false);
// 计时器复位
chronometer.setBase(SystemClock.elapsedRealtime());
}
});
// 添加震动功能
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener(){
@Override
public void onChronometerTick(Chronometer chronometer) {
// 获取计时器上的字符串
String time = chronometer.getText().toString();
// 将字符截取并转为int类型数值计算成秒
int newTime = Integer.parseInt(time.substring(0,time.indexOf(":")))*60 +
Integer.parseInt(time.substring(time.length()-2));
// 每整十秒震动一次,一次0.5秒
if (newTime%10==0 && newTime!=0){
vibrator.vibrate(new long[]{
0,500},-1); // 震动一下0.5秒 -1代表不重复
}
}
});
}
}
♦ 配置 AndroidManifest.xml 添加权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication_test">
<!-- 拨号权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 摄像机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 手电筒权限 -->
<uses-permission android:name="android.permission.FLASHLIGHT" />
<!-- 震动权限 -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.VIBRATOR" />
<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="com.example.myapplication.TimeCountActivity"></activity>
<activity android:name="com.example.myapplication.FlashLightActivity" />
<activity android:name="com.example.myapplication.MyToolActivity" />
<activity android:name="com.example.myapplication.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
♦ 检测
计时器检测