Download presentation
Presentation is loading. Please wait.
Published byTracy Manning Modified 6년 전
2
Contents 학습목표 이벤트를 처리하는 여러 가지 형식과 각 형식의 장단점에 대해 상세하게 연구하고 기본적인 이벤트에 대한 실습을 한다. 사용자의 입력을 자유자재로 처리하기 위해서 반드시 습득해야 하는 중요한 기술 실습. 학습내용 이벤트 핸들러 여러 가지 이벤트
3
화면을 누르는 터치 동작은 콜백 메서드나 리스너의 핸들러로 받는다.
6.2.1 터치 입력 화면을 누르는 터치 동작은 콜백 메서드나 리스너의 핸들러로 받는다. boolean onTouchEvent (MotionEvent event) boolean onTouch (View v, MotionEvent event) 콜백 메서드는 이벤트 정보만 받고 리스너는 이벤트 대상인 v까지 받는다. MotionEvent.getAction : 이벤트 정보 동 작 설 명 ACTION_DOWN 화면을 눌렀다. ACTION_MOVE 누른채로 움직였다. ACTION_UP 화면에서 손가락을 뗐다. getX(), getY() : 터치한 좌표 전달
4
6.2.1. 외부 변수 액세스 C06_FreeLine.java
public class C06_FreeLine extends Activity { private MyView vw; ArrayList<Vertex> arVertex; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); vw = new MyView(this); setContentView(vw); arVertex = new ArrayList<Vertex>(); } // 정점 하나에 대한 정보를 가지는 클래스 public class Vertex { Vertex(float ax, float ay, boolean ad) { x = ax; y = ay; Draw = ad; float x; float y; boolean Draw; C06_FreeLine.java protected class MyView extends View { Paint mPaint; public MyView(Context context) { super(context); // Paint 객체 미리 초기화 mPaint = new Paint(); mPaint.setColor(Color.BLACK); mPaint.setStrokeWidth(3); mPaint.setAntiAlias(true); } public void onDraw(Canvas canvas) { canvas.drawColor(Color.LTGRAY); // 정점을 순회하면서 선분으로 잇는다. for (int i=0;i<arVertex.size();i++) { if (arVertex.get(i).Draw) { canvas.drawLine(arVertex.get(i-1).x, arVertex.get(i-1).y, arVertex.get(i).x, arVertex.get(i).y, mPaint); } } }
5
6.2.1 터치 입력 C06_FreeLine.java // 터치 이동시마다 정점들을 추가한다.
public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { arVertex.add(new Vertex(event.getX(), event.getY(), false)); return true; } if (event.getAction() == MotionEvent.ACTION_MOVE) { arVertex.add(new Vertex(event.getX(), event.getY(), true)); invalidate(); return false;
6
6.2.2. 키보드 입력 키보드로 문자 입력시의 동작 처리. 키보드 이벤트는 다음 콜백 매서드가 처리한다.
콜 백 : boolean onKeyDown (int keyCode, KeyEvent event) 리스너 : boolean onKey (View v, int keyCode, KeyEvent event) event로 키와 동작이 전달된다 keyCode 인수 : 눌러진 키 Key Event 클래스는 키보드 이벤트에 대한 여러 가지 정보를 구하는 메서드 제공.
7
6.2.2. 키보드 입력 KeyCode 상수값 상수 설명 KEYCODE_DPAD_LEFT 왼쪽 이동키
KEYCODE_DPAD_RIGHT 오른쪽 이동키 KEYCODE_DPAD_UP 위쪽 이동키 KEYCODE_DPAD_DOWN 아래쪽 이동키 KEYCODE_DPAD_CENTER 이동키 중앙의 버튼 KEYCODE_A 알파벳 A, 알파벳 B부터는 KEYCODE_B식이다 KEYCODE_0 숫자 0. 1부터는 KEYCODE_1식이다. KEYCODE_CALL 통화 KEYCODE_ENDCALL 통화 종료 KEYCODE_HOME 홈 KEYCODE_BACK 뒤로 KEYCODE_VOLUME_UP 볼륨 증가 버튼 KEYCODE_VOLUME_DOWN 볼륨 감소 버튼
8
MotionEvent.getAction : 이벤트 정보
키보드 입력 MotionEvent.getAction : 이벤트 정보 동 작 설 명 ACTION_DOWN 키를 눌렀다. ACTION_UP 키를 뗐다. ACTION_MULTIPLE 같은 키를 여러 번 눌렀다.
9
6.2.2. 키보드 입력 C06_MoveCircle.java
public class C06_MoveCircle extends Activity { private MyView vw; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); vw = new MyView(this); vw.setFocusable(true); vw.setFocusableInTouchMode(true); setContentView(vw); } protected class MyView extends View { float mX,mY; int mColor; public MyView(Context context) { super(context); mX = 100; mY = 100; mColor = Color.BLUE; C06_MoveCircle.java public void onDraw(Canvas canvas) { canvas.drawColor(Color.LTGRAY); Paint Pnt = new Paint(); Pnt.setColor(mColor); Pnt.setAntiAlias(true); canvas.drawCircle(mX,mY,16,Pnt); } public boolean onKeyDown(int KeyCode, KeyEvent event) { super.onKeyDown(KeyCode, event); if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (KeyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: mX-=5; invalidate(); return true; case KeyEvent.KEYCODE_DPAD_RIGHT: mX+=5;
10
6.2.2. 키보드 입력 C06_MoveCircle.java case KeyEvent.KEYCODE_DPAD_UP:
mY-=5; invalidate(); return true; case KeyEvent.KEYCODE_DPAD_DOWN: mY+=5; case KeyEvent.KEYCODE_DPAD_CENTER: if (mColor == Color.BLUE) { mColor = Color.RED; } else { mColor = Color.BLUE; } return false;
11
위젯의 이벤트 처리 위젯도 뷰와 동일하지만 이벤트를 한꺼번에 처리할 수 있다. 클릭은 눌렀다 떼는 동작을 의미한다. 버튼은 단순한 차일드 위젯으로 이미 상속을 받지 않고 이벤트를 처리할 수 있어야 한다. 그래서 클릭 이벤트에는 콜백 이벤트가 정의되어 있지 않고 리스너 이벤트로 받아야 한다. void onClick (View v)
12
위젯의 이벤트 처리 C06_fruit.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ff0000" android:textSize="40sp" android:text="과일" /> C06_fruit.xml <LinearLayout android:layout_width="wrap_content" android:layout_height="fill_parent" > <Button android:layout_height="wrap_content" android:text="Apple" /> android:text="Orange" </LinearLayout>
13
6.2.3. 위젯의 이벤트 처리 – 리스너가 각각 존재 C06_fruit.java
public class C06_Fruit extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c06_fruit); Button btnApple= (Button)findViewById(R.id.apple); btnApple.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { TextView textFruit=(TextView)findViewById(R.id.fruit); textFruit.setText("Apple"); } }); C06_fruit.java Button btnOrange =(Button)findViewById(R.id.orange); btnOrange.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { TextView textFruit=(TextView)findViewById(R.id.fruit); textFruit.setText("Orange"); } });
14
6.2.3. 위젯의 이벤트 처리 – 인터페이스 구현 C06_fruit.java
public class C06_Fruit extends Activity implements View.OnClickListener { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c06_fruit); Button btnApple =(Button)findViewById(R.id.apple); btnApple.setOnClickListener(this); Button btnOrange =(Button)findViewById(R.id.orange); btnOrange.setOnClickListener(this); } C06_fruit.java public void onClick(View v) { TextView textFruit=(TextView)findViewById(R.id.fruit); switch (v.getId()) { case R.id.apple: textFruit.setText("Apple"); break; case R.id.orange: textFruit.setText("Orange"); }
15
6.2.3. 위젯의 이벤트 처리 – 인터페이스 구현 멤버 객체
C06_fruit.java public class C06_Fruit extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c06_fruit); findViewById(R.id.apple).setOnClickListener(mClickListener); findViewById(R.id.orange).setOnClickListener(mClickListener); } C06_fruit.java Button.OnClickListener mClickListener = new View.OnClickListener() { public void onClick(View v) { TextView textFruit=(TextView)findViewById(R.id.fruit); switch (v.getId()) { case R.id.apple: textFruit.setText("Apple"); break; case R.id.orange: textFruit.setText("Orange"); } };
16
6.2.3. 위젯의 이벤트 처리- XML 속성과 이밴트 핸들러 연결
C06_fruit2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ff0000" android:textSize="40sp" android:text="과일" /> C06_fruit2.xml <LinearLayout android:layout_width="wrap_content" android:layout_height="fill_parent" > <Button android:layout_height="wrap_content" android:onClick="mOnClick" android:text="Apple" /> android:text="Orange" </LinearLayout>
17
6.2.3. 위젯의 이벤트 처리- XML 속성과 이밴트 핸들러 연결
C06_fruit.java public class C06_Fruit2 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c06_fruit2); } C06_fruit.java public void mOnClick(View v) { TextView textFruit=(TextView)findViewById(R.id.fruit); switch (v.getId()) { case R.id.apple: textFruit.setText("Apple"); break; case R.id.orange: textFruit.setText("Orange"); }
18
롱클릭 롱크릭 : 일정한 시간동안 계속 누르고 있는 동작(마우스 오른쪽 버튼에 해당)으로 컨텍스트 메뉴 여는 용도로 활용 void setOnLongClickListener (View.OnLongClickListener) boolean onLongClick(View v)
19
롱클릭 C06_fruit2.xml <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ff0000" android:textSize="40sp" android:text="0" /> <LinearLayout C06_fruit2.xml <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="mOnClick" android:text="감소" /> android:text="증가" </LinearLayout>
20
롱클릭 C06_fruit.java public class C06_LongClick extends Activity { int mCount = 0; TextView mTextCount; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c06_longclick); mTextCount=(TextView)findViewById(R.id.count); findViewById(R.id.decrease).setOnLongClickListener(mLongClickListener); findViewById(R.id.increase).setOnLongClickListener(mLongClickListener); } public void mOnClick(View v) { switch (v.getId()) { case R.id.decrease: mCount--; mTextCount.setText("" + mCount); break; case R.id.increase: mCount++; C06_fruit.java View.OnLongClickListener mLongClickListener = new View.OnLongClickListener() { public boolean onLongClick(View v) { switch (v.getId()) { case R.id.decrease: mCount = 0; mTextCount.setText("" + mCount); return true; case R.id.increase: mCount = 100; break; } return false; };
21
6.2.5. 포커스 관리 키보드 이벤트는 포커스를 가진 뷰에게만 전달.
포커스는 다음 키 입력을 받을 뷰가 누구인지를 가리키는 것을 말함. 대부분의 운영체제는 포커스를 가진 뷰를 색다르게 표시. 일반모드 : 모바일 환경의 심플한 디자인과 어울리지 않음. 터치모드 : 터치 스크린 사용시는 임의의 위젯을 클릭할 수 있으므로 포커스 표시를 하지 않는다. 터치 모드 전환은 시스템에 관리하며 응용 프로그램이 통제할 수 없다 모 드 XML 속성 포커스 설정 포커스 조사 일반 모드 focusable setFocusable isFocusable 터치 모드 focusablelnTouchMode setFocusablelnTouchMode isFocusablelnTouchMode
22
롱클릭 C06_focustest.xml <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <Button android:text="Button 11" /> <Button android:text="Button 12" /> </TableRow> <Button android:text="Button 21" /> <Button android:text="Button 22" /> </TableLayout>
23
6.2.5. 롱클릭 C06_focustest2.xml C06_focustest2.xml 속 성 메서드 설 명
속 성 메서드 설 명 nextFocusLeft setNextFocusLeftld 왼쪽 이동시의 포커스 이동 위젯 nextFocusRight setNextFocusRightld 오른쪽 이동시의 포커스 이동 위젯 nextFocusUp setNextFocusUpld 위쪽 이동시의 포커스 이동 위젯 nextFocusDown setNextFocusDownld 아래쪽 이동시의 포커스 이동 위젯 C06_focustest2.xml <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <Button android:text="Button 11" /> <Button android:text="Button 12" /> C06_focustest2.xml </TableRow> <TableRow> <Button android:text="Button 21" /> <Button android:text="Button 22" /> </TableLayout>
24
타이머 이벤트 이벤트는 주로 사용자, 시스템 상황 변화에 따라 발생. 타이머 이벤트는 시계나 타이머 또는 애니메이션이나 백그라운드 감시 작업에도 적합. 일정한 주기로 반복적인 작업을 할 때는 스레드를 쓰는 것이 원칙적이나 간단히 타이머를 이용할 수도 있다. 주기적인 작업을 처리하는 방법.
25
6.2.6. 타이머 이벤트 –핸들러 멤버 C06_Timer.xml C06_Timer.java
<LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#cccccc" android:gravity="center_horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40sp" android:textColor="#000000" /> </LinearLayout> C06_Timer.java public class C06_Timer extends Activity { int value=0; TextView mText; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c06_timer); mText=(TextView)findViewById(R.id.text); mHandler.sendEmptyMessage(0); } Handler mHandler = new Handler() { public void handleMessage(Message msg) { value++; mText.setText("Value = " + value); mHandler.sendEmptyMessageDelayed(0,1000); };
26
6.2.6. 타이머 이벤트 –onCreate에서 생성한 핸들러
C06_Timer.xml <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#cccccc" android:gravity="center_horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40sp" android:textColor="#000000" /> </LinearLayout> C06_Timer.java public class C06_Timer extends Activity { int value=0; TextView mText; Handler mHandler; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c06_timer); mText=(TextView)findViewById(R.id.text); mHandler = new Handler() { public void handleMessage(Message msg) { value++; mText.setText("Value = " + value); if (value < 5) { mHandler.sendEmptyMessageDelayed(0,1000); } } }; mHandler.sendEmptyMessage(0); }}
27
6.2.6. 타이머 이벤트 –타이머 객체 C06_Timer.xml C06_Timer.java
<LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#cccccc" android:gravity="center_horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40sp" android:textColor="#000000" /> </LinearLayout> C06_Timer.java public class C06_Timer extends Activity { int value=0; TextView mText; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.c06_timer); mText=(TextView)findViewById(R.id.text); new CountDownTimer(10 * 1000, 1000) { public void onTick(long millisUntilFinished) { value++; mText.setText("Value = " + value); if (value == 5) { cancel(); } public void onFinish() { }.start(); } }
Similar presentations