안드로이드 3) Event 처리

밍나·2022년 1월 6일
0

Android

목록 보기
3/36

Concepts of Event Programming

1. Event Model

  • Hierarchy Event Model : 원론적 이벤트, 유저가 앱에 가할 수 있는 원론적인 이벤트
    • ex) Touch Event, Key Event
    • 액티비티에서 onTouchEvent 함수 등을 오버라이드 받아서 정의만 해주면 함수가 바로 call
  • Delegation Event Model : OOP적 이벤트, OOP적으로 이벤트를 재해석해서 처리(OOP 프로그램은 명료성 자체가 중요)
    • TouchEvent로 모든 이벤트를 처리할 수 있긴하지만 OOP의 명료성에 따라
    • 1) Event가 발생한 뷰 객체를 명료하게 지정하고
    • 2) 이벤트 종류를 성격에 따라 구분함

Key Event

  • 폰의 키를 누르는 순간의 이벤트, 원론적 이벤트
  • 종류
    • onKeyDown : 키가 눌린 순간의 이벤트
    • onKeyUp : 키를 떼는 순간의 이벤트
    • onKeyLongPress : 키를 오래 누르는 순간의 이벤트
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        when(keyCode){
            KeyEvent.KEYCODE_0 -> Log.d("key", "0번 키가 눌렸어요")
            KeyEvent.KEYCODE_A -> Log.d("key", "A 키가 눌렸어요")
        }
        return super.onKeyDown(keyCode, event)
    }

유저가 키를 누름 → onKeyDown 함수가 call → 매개변수로 키 코드값 전달 → 키 코드값으로 유저가 어떤 키를 눌렀는지 알 수 있음 → 이벤트 진행

※ 카카오톡 등 앱에서 글자를 입력할 때의 키보드는 Soft Keyboard라고 한다. 앱에서 Soft Keyboard는 단지 버튼일 뿐이다. 따라서 Key Event가 작동하지 않는다.
※ 그럼 Key Event는 언제 쓰이냐? 안드로이드 핸드폰 하단의 back, home, overview 버튼과 기기에 power, volume up/down 버튼을 System Button이라고 한다. 이 버튼들이 안드로이드에서 키 이벤트로 처리가 된다. 특히 back 버튼 처리에 많이 사용된다.

Touch Event

  • 유저가 화면을 터치해서 발생시키는 이벤트
  • onTouchEvent() 이벤트 콜백함수 이용
  • 종류
    • ACTION_DOWN : 화면을 터치한 순간의 이벤트
    • ACTION_UP : 화면에서 터치를 떼는 순간의 이벤트
    • ACTION_MOVE : 화면을 터치해 이동하는 순간의 이벤트
override fun onTouchEvent(event: MotionEvent?): Boolean {
        when(event?.action){ //action 속성으로 이벤트 종류 확인
            MotionEvent.ACTION_DOWN -> {
                // ...
            }
            MotionEvent.ACTION_UP -> {
                // ...
            }
        }
        return super.onTouchEvent(event)
    }

유저가 액티비티 화면을 터치 → onTouchEvent 함수가 call → 매개변수로 터치한 지점의 좌표값이나 터치 이벤트의 종류가 전달 → 매개변수를 활용해 다양한 업무 로직 구현

  • 이벤트 좌표
    • x : 이벤트가 발생한 View 내에서의 좌표
    • y : 이벤트가 발생한 View 내에서의 좌표
    • rawX : 화면에서의 좌표
    • rawY : 화면에서의 좌표
override fun onTouchEvent(event: MotionEvent?): Boolean {
        when(event?.action){
            MotionEvent.ACTION_DOWN -> {
                Log.d("location x", "Touch down event... x:${event.x}, rawX:${event.rawX}")
            }
        }
        return super.onTouchEvent(event)
    }

Click Event

  • 뷰를 유저가 터치하는 순간의 이벤트
  • View 클래스에 선언된 이벤트, 필요에 따라 체크박스에서는 StateChange 이벤트가 리스트뷰에서는 ItemClickEvent로 재정의해서 사용
  • ClickEvent와 LongClickEvent 제공
button.setOnClickListener(object : View.OnClickListener {
            override fun onClick(p0: View?){
                // ...
            }
        })
  • 뷰에 걸리는 이벤트는 항상 Event Source와 Event Handler라는 객체로 구분되어서 처리된다
    • Event Source : Event가 발생한 객체, 뷰 객체
    • Event Handler : Event 처리 내용을 가지고 있는 객체, 개발자가 만드는 객체
    • Event Source로 어떻게 Event Handler를 작동 시키냐? : 리스너로 연결시켜서 작동한다. 즉 Event Source에서 이벤트가 발생했을 때 리스너로 등록되어 있는 Event Handler의 코드가 실행된다.
    • 위의 코드에서 button이 Event Source, 리스너의 매개변수(() 안쪽에 인터페이스를 구현한 객체)가 Event Handler이다.
button.setOnClickListener { 
            // ...
        }
  • SAM 기법(Single Abstract Method)
    • 하지만 항상 위처럼 작성하려면 귀찮지 않을까?
    • 그래서 코틀린 언어에서 제공하는 SAM 기법을 사용해 간단하게 구현 가능하다.
    • 인터페이스를 구현한 객체를 매개변수로 지정할 때 그 인터페이스의 추상함수가 하나라면 함수내부의 로직만 중괄호 안에 작성하면 된다.
profile
🤗🤗🤗

0개의 댓글