티스토리 뷰

Android/Concept

[Android] 이벤트 별쾅쾅.

ch4njun 2019. 7. 19. 14:18
반응형

기본적으로 핸드폰에 발생하는 이벤트는 대부분 터치이벤트이다.

터치이벤트가 발생하면 어떤 과정을 통해서 어떤 View에서 발생한 이벤트인지 찾고 그에 해당되는 이벤트가 발생되는지 아래 과정을 통해 간단하게 소개하겠다.

 

 

터치된 영역의 최상위 루트뷰부터 하위로 dispatchEvent를 호출하며 찾아가고,

onTouchEvent를 호출하면서 해당 View에 대한 이벤트인지 확인한다.

 

해당 View에 대한 이벤트라면 반환값이 TRUE이 되고, 아니라면 FALSE를 반환해 다음 View로 넘어간다.

 ( 당연히 TRUE가 반환되게 되면 그에 해당하는 이벤트 효과가 발생된다. )

 

 

public boolean dispatchTouhEvent(MotionEvent e);
public boolean onTouchEvent(Motion e);

   → 위 두개의 함수를 오버라이딩해서 이벤트정보를 획득한다.

 


 

그러나 위 방식으로 이벤트를 읽어들이는 것은 너무 복잡하고 가독성이 떨어진다.

 

그래서 안드로이드에서는 추가로 이벤트를 등록하는 방법을 제공한다.

 

View 에는 이렇게 내부 인터페이스가 이벤트별로 정의되어있다.

OnClickListener 는 가장 많이사용되는 조합으로, ACTION_DOWN + ACTION_UP의 조합이다.

이외에 OnLongClickListener 등의 이벤트도 있다.

 

 

1. 이벤트 리스너 오버라이딩을 통한 이벤트 리스너 등록.

 - 내가 새로운 View를 만들 때.

Class CustomView extends View {  //View는 이미 정의되어있는 이벤트들이있다.
					// 그 중에 사용할 이벤트를 오버라이딩해서 사용.
	public boolean onTouchEvent(MotionEvent e) {
		// .........  
	}
}

 

 - 내부 클래스 정의를 통한 이벤트 리스너 등록.

Class MyTouchListener implements View.OnTouchListener {
	@Override
	public boolean onTouch(View v, MotionEvent e) {
		.........
		return false;
	}
}

Button bt = (Button) findViewById(R.id.Button1);
bt.setOnTouchListener(new MyTouchListener());

 

 - 익명 클래스 정의를 통한 이벤트 리스너 등록.

Button bt = (Button) findViewById(R.id.Button1);
bt.setOnTouchListener(new View.onTouchEvent() {
    public boolean onTouch(View v, MotionEvent event){
        ......
        return false;
    }
});

 

 - 액티비티에 이벤트 리스너 상속을통한 등록.

Class MainActivity extends Activity implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        switch( v.getId() ) {
            case R.id.button_view:
                ......
                break;
        }
    }
}
protected void onCreate(Bundle savedInstanceState) {
    Button bt = (Button) findViewById(R.id.Button1);
    bt.setOnTouchListener(this);
}

 

 

2. XML에서 onClick속성을 통한 리스너 등록

    얘는 콜백함수를 구현해두고 android:onclick(________) 로 등록해주면 끝.

    ( Click에 한해서는 얘가 초간단 보스 )

    콜백함수를 정의할 때도 인자로 View v를 줘서 getId()를 사용할 수 있다.

 

 

 


Touch 이벤트 말고도 Key 이벤트도 있다.

Key 이벤트에는 Down/Up 이 있지만, 비중이 적다.

그래서 onClick같은 속성은 없다. 그래서 OnKeyListener를 통해 리스너를 등록해야 한다.

 

onBackPressed 키 재정의 ? ( 핸드폰의 뒤로가기키 )

@Override
public void onBackPressed() {
	int mExitModeTime = 0;
	if ( mExitModeTime != 0 && SystemClock.uptimeMillis() - mExitModeTime < 3000 ) {
		finish();
	}
	else {
		Toast.makeText(this, "한번더 누르면 종료", Toast.LENGTH_LONG).show();
		mExitModeTime = SystemClock.uptimMillis();
	} 
}
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함