#14 안드로이드 스튜디오로 안드로이드 앱 만들기 - 사용자 이벤트 처리 : 하이어라키 이벤트 모델(Hierarchy Event Model)

2018. 1. 30. 12:00안드로이드

반응형

#9 안드로이드 스튜디오로 안드로이드 앱 만들기 - 레이아웃(Layout)을 활용한 다양한 뷰(View) 배치 : 탭 화면 구현 - TabHost

#10 안드로이드 스튜디오로 안드로이드 앱 만들기 - 레이아웃(Layout)을 활용한 다양한 뷰(View) 배치 : ConstraintLayout

#11 안드로이드 스튜디오로 안드로이드 앱 만들기 - 다양한 사용자 알림 효과 : 진동과 소리

#12 안드로이드 스튜디오로 안드로이드 앱 만들기 - 다양한 사용자 알림 효과 : 토스트(Toast), 다이얼로그(Dialog)

#13 안드로이드 스튜디오로 안드로이드 앱 만들기 - 사용자 이벤트 처리 : 델리게이션 이벤트 모델(Delegation Event Model)





하이어라키 이벤트 모델(Hierarchy Event Model)은 액티비티가 화면에 출력되었을 때 발생하는 사용자의 키 이벤트과 화면 터치 이벤트를 처리하기 위한 모델이다. 대부분 화면이 View로 구성되다보니, 이벤트를 View의 델리게이션 이벤트 모델로 처리하지만, 때에 따라 직접 터치 이벤트와 키 이벤트를 처리해야 하는 경우가 있다.


하이어라키 이벤트 모델(Hierarchy Event Model)은 델리게이션 이벤트 모델처럼 이벤트 소스와 이벤트 핸들러를 리스너로 연결하여 처리하는 구조가 아니다. 만약 액티비티에서 터치 이벤트와 키 이벤트를 직접 처리하고 싶다면 이벤트 발생 시 자동 호출되는 함수만 액티비티 내에 재정의하면 된다.


터치 이벤트(Touch Event)

액티비티에 보이는 내용을 사용자가 손가락으로 조작하는 일은 터치 이벤트로 처리하여 구현한다. 또는 액티비티 화면을 터치해서 손가락으로 상하좌우 어떤 방향으로 밀었는지를 알아낼 때도 터치이벤트로 처리한다.


onTouchEvent 메서드가 호출되는 터치 이벤트는 3가지 타입이 있다.

■ ACTION_DOWN : 화면에 터치된 순간의 이벤트

■ ACTION_UP : 터치를 때는 순간의 이벤트

■ ACTION_MOVE : 터치한 후 이동하는 순간의 이벤트


또한, 터치 이벤트가 발생한 지점의 x, y 좌푯값을 얻을 수도 있다.

■ getX()

■ getY()

■ getRawX()

■ getRawY()

getX(), getY() 함수는 이벤트가 발생한 뷰 내에서의 좌푯값을 반환하며, getRawX(), getRawY() 함수는 화면에서의 좌푯값을 반환한다.



키 이벤트(Key Event)

사용자가 안드로이드 스마트폰의 키를 눌렀을 때 이벤트 처리가 필요한 경우가 있다. 흔히 키 이벤트(Key Event)라고 하면 키보드에서 키를 누른 순간의 이벤트 처리하고 생각하기 쉬운데, 안드로이드의 소프트 키보드는 키 이벤트로 처리할 수 없다. 소프트 키보드는 문자를 쓸때 자판을 말하는 것이다.


안드로이드의 키 이벤트(Key Event)는 키보드 이외의 키 이벤트를 처리하기 위해 자주 이용된다. 안드로이드의 대표적인 키 이벤트 처리로는 뒤로가기 버튼 처리가 대부분이다. 뒤로가기 버튼을 눌렀을 때 "정말 종료하시겠습니까?" 또는 "종료하려면 한 번 더 누르세요." 라는 메시지를 띄우는 작업은 키 이벤트를 처리해서 구현한다.


■ onKeyDown : 키가 눌린 순간의 이벤트

■ onKeyUp : 키를 떼는 순간의 이벤트

■ onKeyLongPress : 키를 오래 누르는 순간의 이벤트





그럼 간단하게 만들어 보자.

#13 안드로이드 스튜디오로 안드로이드 앱 만들기 - 사용자 이벤트 처리 : 델리게이션 이벤트 모델(Delegation Event Model)

여기 예제에서 조금 수정하여 만들어 볼 것이다.


Step 1_ onTouchEvent() 함수 및 onKeyDown() 함수 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.example.event;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener{
 
    TextView bellTextView;
    TextView labelTextVeiw;
    CheckBox repeatCheckView;
    CheckBox vibrateCheckView;
    Switch switchView;
 
    float initX;
    long initTime;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        bellTextView = (TextView)findViewById(R.id.bell_name);
        labelTextVeiw=(TextView)findViewById(R.id.label);
        repeatCheckView=(CheckBox)findViewById(R.id.repeatCheck);
        vibrateCheckView=(CheckBox)findViewById(R.id.vibrate);
        switchView=(Switch)findViewById(R.id.onOff);
 
        bellTextView.setOnClickListener(this);
        labelTextVeiw.setOnClickListener(this);
 
        repeatCheckView.setOnCheckedChangeListener(this);
        vibrateCheckView.setOnCheckedChangeListener(this);
        switchView.setOnCheckedChangeListener(this);
 
 
    }
 
 
    private void showToast(String message){
        Toast toast=Toast.makeText(this, message, Toast.LENGTH_SHORT);
        toast.show();
    }
 
 
    @Override
    public void onClick(View v) {
        if(v==bellTextView){
            showToast("벨 텍스트 클릭...");
 
        }else if(v==labelTextVeiw){
            showToast("라벨 텍스트 클릭...");
        }
    }
 
 
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isCheck) {
        if(buttonView==repeatCheckView){
            showToast("repeat checkbox is "+isCheck);
 
        }else if(buttonView==vibrateCheckView){
            showToast("vibrate checkbox is "+isCheck);
 
        }else if(buttonView==switchView){
            showToast("switch is "+isCheck);
 
        }
 
    }
 
    //화면을 왼쪽으로 밀었는지, 오른쪽으로 밀었는지 확인하는 코드
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
            initX=event.getRawX();
 
        }else if(event.getAction()==MotionEvent.ACTION_UP){
            float diffX=initX-event.getRawX();
            if(diffX>30){
                showToast("왼쪽으로 화면을 밀었습니다.");
 
            }else if(diffX<-30){
                showToast("오른쪽으로 화면을 밀었습니다.");
 
            }
 
        }
 
        return true;
    }
 
    //뒤로가기 버튼을 두 번 누르면 종료하는 로직
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK){
            if(System.currentTimeMillis() - initTime > 3000 ){
                //back button을 누른지 3초가 지난거라면
                showToast("종료할려면 한번 더 누르세요.");
                //현재 시간 저장
                initTime=System.currentTimeMillis();
 
            }else{
                //3초 이내에 back button이 두번 눌린 경우, Activity 종료
                finish();
 
            }
 
            return true;
        }
        return  super.onKeyDown(keyCode, event);
    }
}
 
cs


Step 2_ 완성





반응형