Presentation is loading. Please wait.

Presentation is loading. Please wait.

CHAP 6. 이벤트 처리. © 2012 생능출판사 All rights reserved 폴링과 이벤트 구동 방식.

Similar presentations


Presentation on theme: "CHAP 6. 이벤트 처리. © 2012 생능출판사 All rights reserved 폴링과 이벤트 구동 방식."— Presentation transcript:

1 CHAP 6. 이벤트 처리

2 © 2012 생능출판사 All rights reserved 폴링과 이벤트 구동 방식

3 © 2012 생능출판사 All rights reserved 폴링과 이벤트 구동 방식 이벤트 구동 : Event Driven Programing(EDP, 사건 기반 프로그래밍 ) event-driven programming or event-based programming is a programming paradigm in which the flow of the program is determined by eventsevents 폴링 : 하나의 장치 ( 또는 프로그램 ) 가 충돌 회피 또는 동기화 처리 등을 목 적으로 다른 장치 ( 또는 프로그램 ) 의 상태를 주기적으로 검사하여 일정한 조 건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다. 이 방식은 버 스, 멀티포인트 형태와 같이 여러 개의 장치가 동일 회선을 사용하는 상황 에서 주로 사용된다. 서버의 제어 장치 ( 또는 프로그램 ) 는 순차적으로 각 단 말 장치 ( 또는 프로그램 ) 에 회선을 사용하기 원하는지를 물어본다.

4 © 2012 생능출판사 All rights reserved 안드로이드에서의 이벤트 처리 방법 뷰 클래스의 이벤트 처리 메소드를 재정의 커스텀 뷰를 작성하는 경우 : ( 예 ) 게임 이벤트 처리 객체를 생성하여 컴포넌트에 등록 일반적인 방법

5 © 2012 생능출판사 All rights reserved 안드로이드에서의 이벤트 처리 6 가지 방법 콜백 메서드 정의 리너스 이벤트 구현 액티비티를 통한 리스너 구현 View 를 통한 리스너 구현 익명 이너 클래스 임시 객체 사용 리스너

6 © 2012 생능출판사 All rights reserved 이벤트 처리 메소드 재정의

7 © 2012 생능출판사 All rights reserved 재정의할 수 있는 콜백 메소드 onKeyDown(int, KeyEvent) onKeyUp(int, KeyEvent) onTrackballEvent(MotionEvent) onTouchEvent(MotionEvent) onFocusChanged(boolean, int, Rect)

8 © 2012 생능출판사 All rights reserved 예제... class MyView extends View { int key; String str; public MyView(Context context) { super(context); setBackgroundColor(Color.YELLOW); } public boolean onKeyDown(int keyCode, KeyEvent event) { str = "" + keyCode; invalidate(); return super.onKeyDown(keyCode, event); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); canvas.drawText(" 키코드 = " + str, 0, 20, paint); }

9 © 2012 생능출판사 All rights reserved 예제 public class MyViewEventActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyView w = new MyView(this); w.setFocusable(true); setContentView(w); } …

10 © 2012 생능출판사 All rights reserved 콜백 메소드를 재정의할 때 편리한 기능 [Source] → [Override/Implements Methods…] 사용 ! 단축키 Alt+Shift+s -> v

11 © 2012 생능출판사 All rights reserved 이벤트 처리 객체 사용 버튼에 붙은 리스너 객체가 이벤트를 처리한다.

12 © 2012 생능출판사 All rights reserved 리스너의 종류

13 © 2012 생능출판사 All rights reserved 리스너 객체를 생성하는 방법 리스너 클래스를 내부 클래스로 정의한다. 리스너 클래스를 무명 클래스로 정의한다. 리스너 인터페이스를 액티비티 클래스에 구현한다. 가장 많이 사용되는 방법 !

14 © 2012 생능출판사 All rights reserved 안드로이드에서의 리스너이벤트 처리 방법 리너스 이벤트 구현 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View vm = new View(this); TouchListener Tl = new TouchListener(); vm.setOnTouchListener(Tl); setContentView(vm); } protected class TouchListener implements View.OnTouchListener { public boolean onTouch(View v, MotionEvent event){ if ( event.getAction()== MotionEvent.ACTION_DOWN) { Toast.makeText(EventProcessActivity2.this, " 터치터치 ", 0).show(); return true; } return false; }

15 © 2012 생능출판사 All rights reserved 안드로이드에서의 리스너이벤트 처리 방법 엑티비티에 리스너 인터페이스 구현 public class MyActivity extends Activity implements View.OnTouchListener{ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View vm = new View(this); vm.setOnTouchListener(this); setContentView(vm); } public boolean onTouch(View v, MotionEvent event) { if( event.getAction()== MotionEvent.ACTION_DOWN) { Toast.makeText(this, " 터치터치 ", 0).show(); return true; } return false; }

16 © 2012 생능출판사 All rights reserved 안드로이드에서의 리스너이벤트 처리 방법 뷰가 리스너 구현 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyView vm = new MyView(this); setContentView(vm); } protected class MyView extends View implements View.OnTouchListener { …… public boolean onTouch(View v, MotionEvent event){ if ( event.getAction()== MotionEvent.ACTION_DOWN) { Toast.makeText(EventProcessActivity2.this, " 터치터치 ", 0).show(); return true; } return false; }

17 © 2012 생능출판사 All rights reserved 안드로이드에서의 리스너이벤트 처리 방법 익명 이너 클래스 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View vm = new View(this); vm.setOnTouchListener(Tl); setContentView(vm); } private View.OnTouchListener Tl = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if ( event.getAction() == MotionEvent.ACTION_DOWN) { Toast.makeText (EventProcessActivity5.this, " 터치 이너 ", 0).show(); return true; } return false; } };

18 © 2012 생능출판사 All rights reserved 안드로이드에서의 리스너이벤트 처리 방법 익명 이너 클래스의 임시 객체 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View vm = new View(this); vm.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if ( event.getAction() == MotionEvent.ACTION_DOWN ) { Toast.makeText( EventProcessActivity6.this, " 추상터치 ", 0).show(); return true; } return false; } }); setContentView(vm); }

19 © 2012 생능출판사 All rights reserved 무명 클래스로 이벤트를 처리하는 예제... public class ButtonEvent2Activity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(getApplicationContext(), " 버튼이 눌려졌습니다 ", Toast.LENGTH_SHORT).show(); } }); }

20 © 2012 생능출판사 All rights reserved 무명 클래스 클래스 몸체는 정의되지만 이름이 없는 클래스이다. 무명 클래스는 클래스를 정의하면서 동시에 객체를 생성하게 된다. class ClickListener implements OnClickListener {... } obj = new ClickListener(); obj = new OnClickListener() {.... };

21 © 2012 생능출판사 All rights reserved 코드 분석... public class ButtonEvent2Activity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(getApplicationContext(), " 버튼 눌려졌습니다 ", Toast.LENGTH_SHORT).show(); } }); } 무명 클래스 사용

22 © 2012 생능출판사 All rights reserved <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="myClickListener" android:padding="10dp" android:text=" 버튼을 눌러보세요 " /> XML 을 이용한 이벤트 처리 메소드 이름을 적어준다.

23 © 2012 생능출판사 All rights reserved... public class ButtonEvent4Activity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void myClickListener(View target) { Toast.makeText(getApplicationContext(), " 버튼이 눌려졌습니다 ", Toast.LENGTH_SHORT).show(); } XML 을 이용한 이벤트 처리 XML 에서 호출된다.

24 © 2012 생능출판사 All rights reserved 폼 위젯

25 © 2012 생능출판사 All rights reserved 에디트 텍스트 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/edittext" android:layout_width="fill_parent" android:layout_height="wrap_content" />

26 © 2012 생능출판사 All rights reserved... public class EditTextActivity extends Activity { @Override public void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final EditText edittext = (EditText) findViewById(R.id.edittext); edittext.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { Toast.makeText(getApplicationContext(), edittext.getText(), Toast.LENGTH_SHORT).show(); return true; } return false; } }); } 에디트 텍스트의 이벤트 처리

27 © 2012 생능출판사 All rights reserved 체크 박스 XML 로 체크 박스를 선언한다.... <CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="check it out" />

28 © 2012 생능출판사 All rights reserved 체크박스의 이벤트 처리... final CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox); checkbox.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 체크 박스가 클릭되면 호출된다. 체크 여부를 확인한다. if (((CheckBox) v).isChecked()) { Toast.makeText(CheckBoxTest.this, "Selected", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(CheckBoxTest.this, "Not selected", Toast.LENGTH_SHORT).show(); } });...

29 © 2012 생능출판사 All rights reserved 라디오 버튼 XML 로 라디오 버튼을 정의한다.... <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RadioButton android:id="@+id/radio_red" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Red"/> <RadioButton android:id="@+id/radio_blue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Blue"/>

30 © 2012 생능출판사 All rights reserved 라디오 버튼의 이벤트 처리... public class RadioButtonTest extends Activity { private OnClickListener radio_listener = new OnClickListener() { public void onClick(View v) { RadioButton rb = (RadioButton) v; Toast.makeText(RadioButtonTest.this, rb.getText(), Toast.LENGTH_SHORT).show(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final RadioButton red = (RadioButton) findViewById(R.id.radio_red); final RadioButton blue = (RadioButton)findViewById(R.id.radio_blue); red.setOnClickListener(radio_listener); blue.setOnClickListener(radio_listener); }

31 © 2012 생능출판사 All rights reserved 토글 버튼 XML 로 라디오 버튼을 정의한다.... <ToggleButton android:id="@+id/togglebutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textOn="Vibrate on" android:textOff="Vibrate off" />

32 © 2012 생능출판사 All rights reserved 토글 버튼... final ToggleButton togglebutton = (ToggleButton) findViewById(R.id.togglebutton); togglebutton.setOnClickListener(new OnClickListener(){ public void onClick(View v){ if(togglebutton.isChecked()){ Toast.makeText(ToggleButtonTest.this,"Checked", Toast.LENGTH_SHORT).show(); } else{ Toast.makeText(ToggleButtonTest.this,"Not checked", Toast.LENGTH_SHORT).show() } }});...

33 © 2012 생능출판사 All rights reserved 레이팅바 XML 로 라디오 버튼을 정의한다.... <RatingBar android:id="@+id/ratingbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="5" android:stepSize="1.0" />

34 © 2012 생능출판사 All rights reserved 레이팅바 … public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final RatingBar ratingbar = (RatingBar) findViewById(R.id.ratingbar); ratingbar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { Toast.makeText(getApplicationContext(), "New Rating: " + rating, Toast.LENGTH_SHORT).show(); } }); }

35 © 2012 생능출판사 All rights reserved 커스텀 버튼 버튼 위에 텍스트 대신에 이미지가 그려져 있는 버 튼

36 © 2012 생능출판사 All rights reserved 커스텀 버튼 정의 XML 로 버튼에 사용되는 이미지를 등록한다. <item android:drawable="@drawable/android_pressed" android:state_pressed="true" /> <item android:drawable="@drawable/android_focused" android:state_focused="true" /> /res/drawable/android_button.xml

37 © 2012 생능출판사 All rights reserved 레이아웃 파일 레이아웃 파일에 버튼을 정의한다. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/android_button" android:padding="10dp" /> /res/layout/main.xml

38 © 2012 생능출판사 All rights reserved 커스텀 버튼 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(getApplicationContext(), "Beep Bop", Toast.LENGTH_SHORT).show(); } }); }

39 © 2012 생능출판사 All rights reserved 키이벤트 키 이벤트를 받으려면 OnKeyListener 리스너를 구현 키를 누르면 사각형이 이동하는 예제를 작성하여 보 자.

40 © 2012 생능출판사 All rights reserved 커스텀 뷰를 정의... public class KeyEventActivity extends Activity { int x = 100, y = 100; protected class MyView extends View { public MyView(Context context) { super(context); setBackgroundColor(Color.YELLOW); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); canvas.drawRect(x, y, x+50, y+50, paint); }

41 © 2012 생능출판사 All rights reserved 커스텀 뷰를 정의 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyView w = new MyView(this); w.setFocusable(true); w.setFocusableInTouchMode(true); setContentView(w); w.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: x -= 30; break; case KeyEvent.KEYCODE_DPAD_RIGHT: x += 30; break; } v.invalidate(); return true; } return false; } });}

42 © 2012 생능출판사 All rights reserved 키 포커스 포커스를 가진 위젯 만이 키패드를 통하여 입력을 받을 수 있다.

43 © 2012 생능출판사 All rights reserved 키 포커스를 위젯에 설정하려면 w.setFocusable(true); w.setFocusableInTouchMode(true);

44 © 2012 생능출판사 All rights reserved 터치 이벤트 일반적으로 커스텀 뷰를 정의하고 onTouchEvent() 재정의 class MyView extends View {... @Override public boolean onTouchEvent(MotionEvent event) { x = (int) event.getX(); y = (int) event.getY();... }

45 © 2012 생능출판사 All rights reserved 터치 이벤트의 종류

46 © 2012 생능출판사 All rights reserved 터치 이벤트 예제 public class TouchEventActivity extends Activity { protected class MyView extends View { int x = 100, y = 100; String str; public MyView(Context context) { super(context); setBackgroundColor(Color.YELLOW); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.MAGENTA); canvas.drawRect(x, y, x + 50, y + 50, paint); canvas.drawText(" 액션의 종류 : " + str, 0, 20, paint); }

47 © 2012 생능출판사 All rights reserved 터치 이벤트 예제 @Override public boolean onTouchEvent(MotionEvent event) { x = (int) event.getX(); y = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_DOWN) str = "ACTION_DOWN"; if (event.getAction() == MotionEvent.ACTION_MOVE) str = "ACTION_MOVE"; if (event.getAction() == MotionEvent.ACTION_UP) str = "ACTION_UP"; invalidate(); return true; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyView w = new MyView(this); setContentView(w); }

48 © 2012 생능출판사 All rights reserved 실행결과

49 © 2012 생능출판사 All rights reserved

50

51 T OUCH E VENT F LOW 정리 onInterceptTouchEvent 는 자식의 dispatchTouchEvent 가 호출 되야 한다면 그 직전에 항상 호출된다. onTouch Listener 는 onTouchEvent Handler 가 호출되기 직전에 항상 호출된다. Listener 가 이벤트를 처리해서 true(consumed) 를 리턴하면 이 어지는 Handler 는 호출되지 않는다. dispatchTouchEvent 는 하위의 dispatchTouchEvent 를 호출한 이후에 자신의 Listener, Handler 를 호출해서 이벤트를 전달한 다. 하위의 dispatchTouchEvent 가 true(consumed) 를 리턴하면, 이 어지는 자신의 Listener, Handler 를 호출되지 않는다. Listener 또는 Handler 에서 ACTION_DOWN 에 대해 true(consumed) 를 리턴하면, 해당하는 dispatchTouchEvent 도 true(consumed) 를 리턴하게 된다. 위의 경우에 이어지는 ACTION_MOVE 와 ACTION_UP 은 해당 dispatchTouchEvent 까지 전달되어 하위로 전달없이 바로 해당 Listener 또는 Handler 를 호출한다.


Download ppt "CHAP 6. 이벤트 처리. © 2012 생능출판사 All rights reserved 폴링과 이벤트 구동 방식."

Similar presentations


Ads by Google