안드로이드 하이어라키(하이라키) 이벤트 모델(Hierachy Event Model)

하이어라키 이벤트 모델로 할수 있는 것

  • 안드로이드 액티비티의 터치이벤트 발생시 그 좌표값을 구할 수 있다.

  • 안드로이드 단말기의 하드웨어 버튼(뒤로가기 버튼등)의 이벤트 처리를 할 수 있다.


하이어라키 이벤트 모델 정의

  • 안드로이드 액티비티 화면에서 발생하는 사용자의 키 이벤트와 화면 터치 이벤트를 처리하기 위한 모델.

[ 잠깐! 위에서 말하는 키 이벤트에 대해 좀 설명이 필요할 것 같다. ]

소프트(soft) 키보드

하이어라키 이벤트 모델에서 처리하는 키 이벤트는 위의 안드로이드 앱 내부에 존재하는 소프트 키보드를 말하는 것이 아니라

안드로이드 단말기 하드웨어(hardware) 키

위와 같은 메뉴버튼, 홈 버튼, 돌아가기 버튼 등과 같이, 안드로이드 단말기에 하드웨어 적으로 장착된 키의 이벤트를 말한다.

  • 안드로이드 앱에서의 대부분의 터치 이벤트는 뷰에서 발생하기 때문에 델리게이션 이벤트 모델을 사용하는 것이 일반적이지만, 때에 따라 직접 터치 이벤트와 키 이벤트를 처리해야 할 경우 사용 된다.
  • 하이어라키 이벤트 모델로 액티비티의 터치 이벤트를 처리할 때에는 터치가 발샌한 지점등을 x,y 좌표값으로 제공하기 때문에 필요한 처리를 하는데 델리게이션 이벤트 모델보다 까다로운 면이 있다.

하이어라키 이벤트 모델의 특징

하이어라키 이벤트 모델은 델리게이션 모델처럼 이베트 소스 - 리스너 - 이벤트 헨들러 구조가 아니다. 액티비티의 전체적인 터치 이벤트 등을 관리 하기 때문에 원하는 액티비티에 이벤트 발생 시 자동 호출되는 함수만 해당 액티비티 내에 재정의 하면 된다. 델리게이션 이벤트 모델보다 소스코드가 직관 적이라 구조자체는 이해하기 쉽다.


하이어라키 이벤트의 터치 이벤트(안드로이드 화면 터치 좌표 구하기)

1
2
3
4
5
6
7
8
9
10
public class MainActivity extends AppCompatActivity {

@Override
public boolean onTouchEvent(MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
Toast.makeText(getApplicationContext(), "터치된 화면의 x 좌표 :" event.getRawX(), Toast.LENGTH_LONG).show();
}
}

}

위 소스는 액티비티가 터치 될 시에 터치된 화면의 x좌표를 구하는 소스이다. 액티비티의 터치시 그 좌표값 정보를 알고 싶다면 해당 액티비티의 onTouchEvent를 위 처럼 재정의 하여 사용하면 된다.

터치 이벤트 종류 설명
ACTION_DOWN 화면에 터치된 순간의 이벤트
ACTION_UP 터치를 떼는 순간의 이벤트
ACTION_MOVE 터치한 후 이동하는 순간의 이벤트

onTouchEvent 메소드에서 호출되는 터치 이벤트는 위와 같다.

좌표정보 메소드 종류 설명
getX() 터치 이벤트가 발생한 x 좌표 but 뷰 내에서의 좌표를 반환
getY() 터치 이벤트가 발생한 y 좌표 but 뷰 내에서의 좌표를 반환
getRawX() 터치 이벤트가 발생한 화면에서의 x 좌표를 반환
getRawY() 터치 이벤트가 발생한 화면에서의 y 좌표를 반환

MotionEvent 객체를 통해 좌표를 가져오는 메소드는 위와 같다.


하이어라키 이벤트의 하드웨어 키 이벤트(안드로이드 단말기 뒤로가기 버튼 이벤트 처리)

하이어라키 이벤트를 이용하여 안드로이드 하드웨어 키의 이벤트 처리를 할 수 있다.(앞서 말했듯이 소프트 키보드 이벤트 처리가 아니다.) 안드로이드 단말기의 하드웨어 키는 주로 홈, 뒤로가기 버튼 또는 메뉴, 검색, 오버뷰 등이 있을 수 있다. 안드로이드 단말기에 따라 하드웨어 키가 다를 수 있다는 것을 염두해 두어야 한다. 다만 홈, 전원, 오버벼 버튼은 일반 애플리케이션에서 이벤트 처리로 제어 할 수 없다.

따라서 앱에서 키 이벤트 처리는 뒤로가기 버튼 처리가 대부분이다. 예를 들어 메인 액티비티에서 안드로이드 단말기의 하드웨어 뒤로가기 버튼을 눌렀을 때, 앱을 종료 시키는 경우가 있을 수 있겠다.

1
2
3
4
5
6
7
8
9
10
11
12
public class MainActivity extends AppCompatActivity {

@Override
public boolean onKeyDown(int keyCode, keyEvent event){
if(keyCode == KeyEvent.KEYCODE_BACK){
//이곳에 안드로이드 단말의 하드웨어 뒤로가기 버튼 클릭시 처리하고 싶은 코드를 넣으면 되겠다.
}

//단말기 종류에 따라 접근 가능한 하드웨어 키를 제어 할 수도 있다.
return super.onKeyDown(keyCode, event);
}
}

앞서 터치이벤트 처럼 단순히 액티비티의 onKeyDown메소드를 재정의 하면 된다. 단말기의 하드웨어 키의 이벤트 종류에 따라 다음의 메소드를 필요에 따라 재정의 하여 사용 하면 된다.

  • onKeyDown : 안드로이드 단말기의 하드웨어 키가 눌린 이벤트발생 시 동작

  • onKeyUp : 안드로이드 단말기의 하드웨어 키가 떼는 이벤트발생 시 동작

  • onKeyLongPress : 안드로이드 단말기의 하드웨어 키가 오래 누르는 이벤트발생 시 동작

  • onBackPressed : 이 함수는 오직 단말기의 뒤로가기 버튼 제어만 목적으로 만들어 졌으므로 다른 키 이벤트는 처리할 수 없다.

1
2
3
4
5
6
7
8
public class MainActivity extends AppCompatActivity {

@Override
public void onBackPressed(){
//오직 단말기의 뒤로가기 버튼이 눌렸을 때문 동작.
super.onBackPressed();
}
}

아마도 단말기의 뒤로가기 버튼에 대한 이벤트 처리가 빈번해서 onBackPressed 메소드를 따로 만들어 둔 것이 아닌가 생각된다. 지금까지 하이어라키 이벤트 모델에 대하여 정리해 보았다.

Related Posts

델리게이션 이벤트 모델(Delegation Event Model)