폰의 키를 누르는 순간의 이벤트.
onKeyDown : 키가 눌렸을 때
onKeyUp : 키를 뗐을 때
onKeyLongPress : 키를 오래 눌렀을 때
class MainActivity : AppCompatActivity() {
// 이전 시간을 저장하기 위한 변수 선언.
var initTime = 0L
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
// onkeyDown 함수를 오버라이드 받으면 자동 생성.
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if(keyCode === KeyEvent.KEYCODE_BACK) { // 뒤로가기 버튼
// currentTimeMillis : 현재시간 - initTime > 3초 이상이라면 if문 실행
if(System.currentTimeMillis() - initTime > 3000) {
Toast.makeText(this, "종료하려면 한번 더 누르세요.",
Toast.LENGTH_SHORT).show()
initTime = System.currentTimeMillis()
return true
}
}
return super.onKeyDown(keyCode, event)
}
}
유저가 화면을 터치할 때 발생하는 이벤트.
onTouchEvent() 콜백함수 이용.
package com.example.touchevent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MotionEvent
import android.widget.TextView
class MainActivity : AppCompatActivity() {
lateinit var resultView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
resultView = findViewById(R.id.view1)
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
var eventType =""
// action 속성으로 이벤틑 종류 확인
when(event?.action) {
// 화면을 터치한 순간의 이벤트
MotionEvent.ACTION_DOWN -> eventType = "DOWN EVENT"
// 화면에서 터치를 땔 떼의 이벤트
MotionEvent.ACTION_UP -> eventType= "UP EVENT"
// 화면을 터치해 이동하는 순간의 이벤트
MotionEvent.ACTION_MOVE -> eventType = "MOVE EVENT"
}
// 좌표
resultView.text="$eventType : x - ${event?.x}, y - ${event?.y}"
return super.onTouchEvent(event)
}
}
뷰를 유저가 터치하는 순간의 이벤트.
ClickEvent와 LongClickEvent 제공.
RelativeLayout으로 만든 UI
<RelativeLayout 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">
// 안드로이드에서 지원하는 타이머 위젯
<Chronometer
android:id="@+id/timer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="100dp"
android:gravity="center_horizontal"
android:textSize="60dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:layout_marginBottom="70dp">
<Button
android:id="@+id/btn1"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Start"
android:textColor="@color/black"
android:textStyle="bold"/>
<Button
android:id="@+id/btn2"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Stop"
android:textColor="@color/black"
android:textStyle="bold"
android:layout_marginLeft="25dp"
android:enabled="false"/>
<Button
android:id="@+id/btn3"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Reset"
android:textColor="@color/black"
android:textStyle="bold"
android:layout_marginLeft="25dp"
android:enabled="false"/>
</LinearLayout>
</RelativeLayout>
class MainActivity : AppCompatActivity() {
// 멈춘 시각을 저장하는 변수 선언
var pauseTime = 0L
lateinit var startButton: Button
lateinit var stopButton: Button
lateinit var resetButton: Button
lateinit var chronometer: Chronometer
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
startButton = findViewById(R.id.btn1)
stopButton = findViewById(R.id.btn2)
resetButton = findViewById(R.id.btn3)
chronometer = findViewById(R.id.timer)
startButton.setOnClickListener {
chronometer.base = SystemClock.elapsedRealtime() + pauseTime
// elapsedRealtime : 시스템이 부팅된 이후 경과된 시간을 반환 (절전 모드에서 지속)
// : 절전 모드에서 보낸 시간을 포함하여 부팅 이후 밀리초를 반환.
chronometer.start()
// 버튼 활성화/비활성화 여부
stopButton.isEnabled=true
resetButton.isEnabled=true
startButton.isEnabled=false
}
stopButton.setOnClickListener {
pauseTime= chronometer.base - SystemClock.elapsedRealtime()
chronometer.stop()
// 버튼 활성화/비활성화 여부
stopButton.isEnabled=false
resetButton.isEnabled=true
startButton.isEnabled=true
}
resetButton.setOnClickListener {
pauseTime = 0L
chronometer.base = SystemClock.elapsedRealtime()
chronometer.stop()
// 버튼 활성화/비활성화 여부
stopButton.isEnabled=false
resetButton.isEnabled=false
startButton.isEnabled=true
}
}
}
결과물을 바로바로 화면에 띄워서 볼 수 있으니 재밌다. 그러다보니 계속 코틀린 공부랑 알고리즘을 뒷전으로 두고 있다. 어려워서 안하고 있는건가? 아마 후자인듯. 자고 일어났을 때 읽은 책 내용들 머릿 속에 다 박혀있었으면 좋겠다.
이런 유용한 정보를 나눠주셔서 감사합니다.