상세 컨텐츠

본문 제목

[안드로이드]타이머 구현하기 countDownTimer 시,분,초

안드로이드

by aries574 2020. 12. 1. 18:30

본문


이번시간에는 스마트폰 시계앱에 들어있는 타이머기능을 만들어보겠습니다.

기능은 간단합니다. 시,분,초를 입력할 수 있는 입력창을 3개 만들고, 시작 버튼을 누르면

타이머가 실행됩니다. 타이머에는 일시정지기능과, 취소기능이 들어갑니다.

 

1. 화면구현(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <FrameLayout
        android:id="@+id/setting"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="95dp"
            android:layout_marginLeft="70dp"
            android:text="시"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="95dp"
            android:layout_marginLeft="120dp"
            android:text="분"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="95dp"
            android:layout_marginLeft="170dp"
            android:text="초"/>



        <EditText
            android:id="@+id/hour"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:gravity="center_horizontal"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginTop="100dp"
            android:layout_marginLeft="50dp"
            android:inputType="number"
            android:hint="00" />

        <EditText
            android:id="@+id/min"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:gravity="center_horizontal"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginTop="100dp"
            android:layout_marginLeft="100dp"
            android:inputType="number"
            android:hint="00" />

        <EditText
            android:id="@+id/second"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:gravity="center_horizontal"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginTop="100dp"
            android:layout_marginLeft="150dp"
            android:inputType="number"
            android:hint="00" />

        <Button
            android:id="@+id/countdown_button"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="150dp"
            android:layout_marginLeft="50dp"

            android:text="시작" />
    </FrameLayout>

    <FrameLayout
        android:id="@+id/timer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <TextView
            android:id="@+id/countdown_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:layout_marginLeft="100dp"
            android:layout_marginTop="95dp"
            android:text="01:10:00"
            android:textSize="50dp" />

        <Button
            android:id="@+id/stop_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="100dp"
            android:layout_marginTop="185dp"
            android:text="일시정지"
            />

        <Button
            android:id="@+id/cancel_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="200dp"
            android:layout_marginTop="185dp"
            android:text="취소"
            />
    </FrameLayout>


</LinearLayout>

 

2. 기능구현(MainActivity.java)

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView countdownText; //타이머 현황

    private Button startButton; //시작버튼
    private Button stopButton;  //정지버튼
    private Button cancelButton;//취소버튼

    private EditText hourText; //시
    private EditText minText; //분
    private EditText secondText;//초

    private CountDownTimer countDownTimer;

    private boolean timerRunning;// 타이머 상태
    private boolean firstState; // 처음인지 아닌지?

    private long time = 0;
    private long tempTime = 0;

    FrameLayout setting; //셋팅화면
    FrameLayout timer; //타이머화면

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        countdownText = findViewById(R.id.countdown_text);
        startButton = findViewById(R.id.countdown_button); //시작
        stopButton = findViewById(R.id.stop_btn); //정지
        cancelButton = findViewById(R.id.cancel_btn);//취소

        hourText = findViewById(R.id.hour);//시
        minText = findViewById(R.id.min); //분
        secondText = findViewById(R.id.second);//초

        setting = findViewById(R.id.setting);
        timer = findViewById(R.id.timer);

        //타이머 시작
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                firstState = true;

                setting.setVisibility(setting.GONE); //설정 사라짐
                timer.setVisibility(timer.VISIBLE);//타이머 생김
                startStop();
            }
        });

        //일시정지
        stopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startStop();
            }
        });

        //취소
        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setting.setVisibility(setting.VISIBLE); //설정 생김
                timer.setVisibility(timer.GONE);//타이머 사라짐
                firstState = true;
                stopTimer();
            }
        });

        updateTimer();
    }

    //타이머 상태에 따른 시작&정지
    private void startStop() {
        if(timerRunning){ //시작이면 정지
            stopTimer();

        }else{
            startTimer(); //정지면 시작
        }
    }

    //타이머구현
    private void startTimer() {

        //처음이면 설정 타이머값을 사용한다.
        if(firstState){
            String sHour    = hourText.getText().toString();
            String sMin     = minText.getText().toString();
            String sSecond  = secondText.getText().toString();
            time = (Long.parseLong(sHour) * 3600000) + (Long.parseLong(sMin) * 60000) + (Long.parseLong(sSecond)*1000) + 1000;

        }else{
               time = tempTime;
        }


        countDownTimer = new CountDownTimer(time, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {

                tempTime = millisUntilFinished;
                updateTimer();
            }

            @Override
            public void onFinish() { }
        }.start();

        stopButton.setText("일시정지");
        timerRunning = true;
        firstState = false;
    }

    //타이머 정지
    private void stopTimer() {
        countDownTimer.cancel();
        timerRunning = false;
        stopButton.setText("계속");
    }

    //시간업데이트
    private void updateTimer() {

        int hour = (int) tempTime / 3600000;
        int minutes = (int) tempTime % 3600000 / 60000;
        int seconds = (int) tempTime % 3600000 % 60000 / 1000;

        String timeLeftText = "";

        timeLeftText =  "" +  hour + ":";

        if(minutes < 10) timeLeftText += "0";
        timeLeftText += minutes +":";

        //초가 10보다 작으면 0이 붙는다.
        if(seconds < 10) timeLeftText += "0";
        timeLeftText += seconds;

        countdownText.setText(timeLeftText);
    }
}

 

3. 실행화면

 

반응형

관련글 더보기

댓글 영역