java / com.bpdev.alarm / MainActivity.java

package com.bpdev.alarm;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.daimajia.androidanimations.library.Techniques;
import com.daimajia.androidanimations.library.YoYo;


public class MainActivity extends AppCompatActivity {
    // 멤버 변수
    ImageView clockImage;
    TextView txtTime;
    EditText inputTime;
    Button btnCancel;
    Button btnStart;
    CountDownTimer timer;
    long intTime;


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

        clockImage = findViewById(R.id.clockImage);
        txtTime = findViewById(R.id.txtTime);
        inputTime = findViewById(R.id.inputTime);
        btnCancel = findViewById(R.id.btnCancel);
        btnStart = findViewById(R.id.btnStart);

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 1. 유저가 입력한 시간을 가져온다.
                String strTime = inputTime.getText().toString().trim();
                intTime = Long.parseLong(strTime);


                // 2. 타이머를 만든다.
                timer = new CountDownTimer(intTime*1000, 1000) {
                    @Override
                    public void onTick(long l) {
                        // 밀리세컨즈
                        long remain = l / 1000;
                        txtTime.setText(remain+"초");
                    }

                    @Override
                    public void onFinish() {
                        MediaPlayer mp = MediaPlayer.create(MainActivity.this, R.raw.alarm);
                        mp.start();

                        YoYo.with(Techniques.Shake)
                                .duration(400)
                                .repeat(3)
                                .playOn(clockImage);
                    }
                };
                timer.start();
            }
        });

        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (timer == null) {
                    return;
                }
                timer.cancel();
                txtTime.setText(intTime+"초");

            }
        });
    }
}

 

 

 

 

res / layout / activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">

    <ImageView
        android:id="@+id/clockImage"
        android:layout_width="280dp"
        android:layout_height="280dp"
        android:layout_marginTop="44dp"
        android:scaleType="centerCrop"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.495"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/alarmclock" />

    <TextView
        android:id="@+id/txtTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="150dp"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="150dp"
        android:text="시간"
        android:textSize="34sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/clockImage" />

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="24dp"
        android:layout_marginTop="440dp"
        android:layout_marginEnd="24dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:text="타이머 시간"
            android:textSize="24sp" />

        <EditText
            android:id="@+id/inputTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="초 입력"
            android:inputType="number"
            android:textColorHint="#BCBCBC"
            android:textSize="24sp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="68dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="16dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout">

        <Button
            android:id="@+id/btnCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:backgroundTint="#185380"
            android:paddingTop="10dp"
            android:paddingBottom="10dp"
            android:text="타이머 취소"
            android:textSize="24sp" />

        <Button
            android:id="@+id/btnStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="1"
            android:backgroundTint="#185380"
            android:paddingTop="10dp"
            android:paddingBottom="10dp"
            android:text="타이머 시작"
            android:textSize="24sp" />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

 

Gradle Scripts / build.gradle (:app)

    plugins {
        id 'com.android.application'
    }

    android {
        namespace 'com.bpdev.alarm'
        compileSdk 33

        defaultConfig {
            applicationId "com.bpdev.alarm"
            minSdk 24
            targetSdk 33
            versionCode 1
            versionName "1.0"

            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }

    dependencies {

        implementation 'androidx.appcompat:appcompat:1.6.1'
        implementation 'com.google.android.material:material:1.9.0'
        implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
        testImplementation 'junit:junit:4.13.2'
        androidTestImplementation 'androidx.test.ext:junit:1.1.5'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

        implementation 'com.daimajia.androidanimations:library:2.4@aar'
    }

 

 

+ Recent posts