20230811 event

기메단·2023년 8월 11일
0

TIL

목록 보기
20/44

KeyEvent

폰의 키를 누르는 순간의 이벤트. 
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)
    }
}

TouchEvent

유저가 화면을 터치할 때 발생하는 이벤트.
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

뷰를 유저가 터치하는 순간의 이벤트. 
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
        }
    }
}

결과물을 바로바로 화면에 띄워서 볼 수 있으니 재밌다. 그러다보니 계속 코틀린 공부랑 알고리즘을 뒷전으로 두고 있다. 어려워서 안하고 있는건가? 아마 후자인듯. 자고 일어났을 때 읽은 책 내용들 머릿 속에 다 박혀있었으면 좋겠다.

1개의 댓글

comment-user-thumbnail
2023년 8월 11일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기