일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ImageView
- 안드로이드컴포즈
- Firebase
- 안드로이드 카카오 지도
- Android
- glide
- 파이어베이스
- android 지도
- Clean Architecture
- 컴포넌트
- Android 애드몹
- RecyclerView
- 애드몹광고
- HTTP
- 안드로이드광고
- 선언형UI
- 젯팩컴포즈
- android daum map
- dynamiclink
- 안드로이드
- 다이나믹 링크
- 아키텍처
- 클린 아키텍처
- JetpackCompose
- android kakao map
- component
- 애드몹배너
- 안드로이드 라이브러리
- 동적 링크
- thread
- Today
- Total
코딩스토리
[Android/안드로이드] 현재시간부터 특정시간까지 카운트다운 세기 본문
쇼핑몰이나 게임을 할 때 보면 "이벤트기간까지 00시00분00초 남았습니다." 이런 형식으로 카운트다운을 세는 레이아웃을 구성해야 할 때가 있습니다.
이번 포스팅에서는 CountDownTimer을 사용해서 현재시간부터 이벤트기간 날짜를 지정해서 그 사이의 시간을 카운트다운 해보는 코드를 작성해보겠습니다.
countDownTimer = new CountDownTimer(200000,1000) {
@Override
public void onTick(long millisUntilFinished) {
tv_timer.setText(getTime());
}
@Override
public void onFinish() {
}
};
CountDownTimer 객체를 생성해줍니다. 여기서 넘겨주는 파라미터는 millislnFuture, countDownIntercal을 넘겨줘야하는데 첫번째 파라미터는 제한시간을 뜻합니다. 이 타이머는 200000밀리초(200초)동안만 작동을 하도록 설정되어있습니다. 두번째 파라미터는 몇초마다 타이머가 작동할것가에 대한 것입니다. 여기서는 1초단위로 타이머가 작동되도록 설정하였습니다.
private String getTime(){
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int c_hour = calendar.get(Calendar.HOUR_OF_DAY);
int c_min = calendar.get(Calendar.MINUTE);
int c_sec = calendar.get(Calendar.SECOND);
Calendar baseCal = new GregorianCalendar(year,month,day,c_hour,c_min,c_sec);
Calendar targetCal = new GregorianCalendar(year,month,day+2,0,0,0); //비교대상날짜
long diffSec = (targetCal.getTimeInMillis() - baseCal.getTimeInMillis()) / 1000;
long diffDays = diffSec / (24*60*60);
targetCal.add(Calendar.DAY_OF_MONTH, (int)(-diffDays));
int hourTime = (int)Math.floor((double)(diffSec/3600));
int minTime = (int)Math.floor((double)(((diffSec - (3600 * hourTime)) / 60)));
int secTime = (int)Math.floor((double)(((diffSec - (3600 * hourTime)) - (60 * minTime))));
String hour = String.format("%02d", hourTime);
String min = String.format("%02d", minTime);
String sec = String.format("%02d", secTime);
return year+"년"+month+"월"+ (day+2)+"일 까지 " + hour + " 시간 " +min + " 분 "+ sec + "초 남았습니다.";
}
getTime함수에서는 이제 이벤트 마감까지 얼마나 남았는지에 대한 text를 가져오는 함수입니다.
baseCal은 현재날짜를 가지고있는 객체이고, targetCal은 비교대상날짜, 즉 이벤트 마감일을 가지고 있는 객체입니다.(현재 코드는 언제나 작동할 수 있도록 현재날짜+2일을 한 상태입니다. 그러니 말일쯤에는 작동하지 않을 수 있으니 주의하시기 바랍니다. 예외처리하기 복잡스..)
countDownTimer.start();
마지막으로 타이머를 작동할 수 있도록 start를 해주면 완성됩니다.
전체코드입니다.
MainActivity.java
package com.lakue.timersample;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.widget.TextView;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class MainActivity extends AppCompatActivity {
CountDownTimer countDownTimer;
TextView tv_timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_timer = findViewById(R.id.tv_timer);
countDownTimer = new CountDownTimer(200000,1000) {
@Override
public void onTick(long millisUntilFinished) {
tv_timer.setText(getTime());
}
@Override
public void onFinish() {
}
};
countDownTimer.start();
}
private String getTime(){
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int c_hour = calendar.get(Calendar.HOUR_OF_DAY);
int c_min = calendar.get(Calendar.MINUTE);
int c_sec = calendar.get(Calendar.SECOND);
Calendar baseCal = new GregorianCalendar(year,month,day,c_hour,c_min,c_sec);
Calendar targetCal = new GregorianCalendar(year,month,day+2,0,0,0); //비교대상날짜
long diffSec = (targetCal.getTimeInMillis() - baseCal.getTimeInMillis()) / 1000;
long diffDays = diffSec / (24*60*60);
targetCal.add(Calendar.DAY_OF_MONTH, (int)(-diffDays));
int hourTime = (int)Math.floor((double)(diffSec/3600));
int minTime = (int)Math.floor((double)(((diffSec - (3600 * hourTime)) / 60)));
int secTime = (int)Math.floor((double)(((diffSec - (3600 * hourTime)) - (60 * minTime))));
String hour = String.format("%02d", hourTime);
String min = String.format("%02d", minTime);
String sec = String.format("%02d", secTime);
return year+"년"+month+"월"+ (day+2)+"일 까지 " + hour + " 시간 " +min + " 분 "+ sec + "초 남았습니다.";
}
}
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">
<TextView
android:id="@+id/tv_timer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
잘 안되시는 분은 다음 github를 참고해주세요.
github.com/lakue119/CountDownSample
'Android > 유용한 기술' 카테고리의 다른 글
[Android/안드로이드] 키보드로 액티비티 화면 조정 adjustPan (0) | 2020.09.10 |
---|---|
[Android/안드로이드] 키보드 보이기/키보드 숨기기를 제어하기 (0) | 2020.09.09 |
[Android/안드로이드] ViewPager 양쪽 뷰 살짝 보이게 만들기 (1) | 2020.09.07 |
[Android/안드로이드] 로컬 웹서버 구축/(Mac)XAMPP 설치 (0) | 2020.08.09 |
[Android/안드로이드] 네이버 아이디로 로그인(Naver Login) 연동 (3) | 2020.08.03 |