계층 구조로 배치 - ConstrainLayout
ConstrainLayout은 안드로이드 플랫폼이 아니라 androidx에서 제공하는 라이브러리입니다. ConstrainLayout을 사용하려면 build파일의 dependencies에 implementation을 선언해야 하지만 이선언을 안드로이드 프로젝트를 만들 때 자동으로 추가되므로 직접 할 필요는 없습니다.
ConstrainLayout은 뷰를 상대 위치로 배치하는 RelativeLayout과 비슷하지만 더 많은 속성을 제공합니다. 게다가 안드로이드 스듀디오는 코드가 아닌 마우스 클릭만으로 레이아웃을 구성할 수 있도록 레이아웃 편집기를 제공하므로 gui환경에서 자유롭게 xml을 구성할 수 있습니다.
사용자 이벤트 처리하기
터치이벤트의 경우
앱의 화면에서 발생하는 사용자 이벤트는 터치입니다. 앱은 어떻게 터치했는지 구분하여 여러 함수들을 동작시킵니다.
이처럼 앱의 화면에서 발생하는 사용자 이벤트를 처리하고 싶다면 액티비티 클래스에 터치 이벤트의 콜백 함수인 onTouchEvent()를 선언하면 됩니다. 콜백 함수란 어떤 이벤트가 발생하거나 시점에 도달한 경우 시스템에서 자동으로 호출하는 함수를 말합니다. 매개변수는 MotionEvent 객체이며, 이 객체에 터치의 종류와 발생 지점(좌푯값)이 담깁니다.
class MainActivity : AppCompatActivity() {
//생략
override fun onTouchEvent(event: MotionEvent?): Boolean {
return super.onTouchEvent(event)
}
}
이벤트의 종류
- ACTION_DOWN: 화면을 손가락으로 누른 순간의 이벤트
- ACTION_UP: 화면에서 손가락을 떼는 순간의 이벤트
- ACTION_MOVE: 화면을 손가락으로 누른 채로 이동하는 순간의 이벤트
터치를 통해 얻는 좌표는 onTouchEvent() 함수의 매개변수인 MotionEvent 객체로 획득합니다
- x: 이벤트가 발생한 뷰의 X 좌표
- y: 이벤트가 발생한 뷰의 Y 좌표
- rawX: 화면의 X 좌표
- rawY: 화면의 Y 좌표
override fun onTouchEvent(event: MotionEvent?): Boolean {
when (event?.action) {
MotionEvent.ACTION_DOWN -> {
Log.d("tag","msg1 x:${event.x},y:${event.y}")
}
MotionEvent.ACTION_UP -> {
Log.d("tag","msg")
}
}
return super.onTouchEvent(event)
}
키이벤트의 경우
키 이벤트는 사용자가 폰의 키를 누르는 순간에 발생합니다. 키 이벤트를 사용하려면 터치 이벤트와 비슷하게 액티비티에서 콜백 함수를 정의하면 이벤트 발생 시 자동으로 호출되는 방식입니다. 첫 번째 매개변수는 키의 코드이며 이 값으로 사용자가 어떤 키를 눌렀는지 식별할 수 있습니다.
- onKeyDown: 키를 누른 순간의 이벤트
- onKeyUp: 키를 떼는 순간의 이벤트
- onKeyLongPress: 키를 오래 누르는 순간의 이벤트
class MainActivity : AppCompatActivity() {
//생략
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
return super.onKeyDown(keyCode, event)
}
override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
when (event?.action) {
KeyEvent.KEYCODE_BACK -> Log.d("tag","BACK")
KeyEvent.KEYCODE_VOLUME_UP -> Log.d("tag","UP")
KeyEvent.KEYCODE_VOLUME_DOWN -> Log.d("tag","DOWN")
}
return super.onKeyDown(keyCode, event)
}
override fun onBackPressed() {
Log.d("tag","msg")
}
}
키 이벤트가 발생하는 키는 폰에서 제공하는 소프트 키보드의 키를 의미하지 않습니다. 하드웨어 키보드로 이벤트를 처리할 수 있습니다. 안드로이드 시스템 버튼도 키로 취급합니다. 뒤로 가기 버튼 이벤트에는 onKeyDown()이나 onKeyUp() 함수를 이용할 수도 있지만 onBackPressed() 함수를 이용할 수도 있습니다.