天天看点

【Android】MyTool工具界面:秒表

文章目录

  • ​​MyTool 工具界面:秒表计时​​
  • ​​♦ 回顾​​
  • ​​♦ 设置 activity_my_tool.xml 界面​​
  • ​​♦ 编写 MyToolActivity 实现功能界面跳转​​
  • ​​♦ 创建 activity_time_count.xml 秒表界面​​
  • ​​♦ 编写 TimeCountActivity 实现功能​​
  • ​​♦ 配置 AndroidManifest.xml 添加权限​​
  • ​​♦ 检测​​

MyTool 工具界面:秒表计时

♦ 回顾

通过上一节的学习,我们实现了工具界面手电筒功能的实现,如下图所示。今天,要在这个界面中实现一个新的功能秒表计时。

【Android】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 秒表界面

  • 基本布局、背景
  • 【Android】MyTool工具界面:秒表
  • 添加计时显示、开始、暂停、重置按钮组件
  • 【Android】MyTool工具界面:秒表
<?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>      

​​返回顶部​​

♦ 检测

【Android】MyTool工具界面:秒表