6 차시이벤트처리 1 학습목표 터치이벤트처리를배운다. XML 의 onclick 속성을사용하여이벤트를처리한다. 2 확인해볼까? 3 이벤트처리하기 1) 학습하기 터치이벤트 public boolean ontouchevent(motionevent event) { swtich(event.getaction()) { case MotionEvent.ACTION_DOWN: // 화면을터치하였을때
// 화면을터치하였을때해야할작업구현 case MotionEvent.ACTION_MOVE: // 화면을드래그하였때 // 화면을드래그하였을때해야할작업구현 case MotionEvent.ACTION_UP: // 화면에서터치가사라질때 // 화면에서터치가사라질때해야할자업구현 case MotionEvent.ACTION_CANCEL: // 터치가취소될때 // 터치가취소될때해야할작업구현 default: return true; [ 예제 6-1] 터치이벤트.java 1 package com.example. 프로젝트명 ; 2 3 import android.app.activity; 4 import android.content.context; 5 import android.graphics.canvas; - 2 -
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 import android.graphics.color; import android.graphics.paint; import android.os.bundle; import android.view.motionevent; import android.view.view; public class 프로젝트명 Activity extends Activity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); MyView myview = new MyView(this); setcontentview(myview); public class MyView extends View { public MyView(Context context) { super(context); float centerx = 0; float centery = 0; float radius = 0; @Override public boolean ontouchevent(motionevent event) { switch (event.getaction()) { case MotionEvent.ACTION_DOWN: centerx = event.getx(); centery = event.gety(); case MotionEvent.ACTION_MOVE: radius = (float) Math.sqrt((event.getX() - centerx) * (event.getx() - centerx) + (event.gety() - centery) * (event.gety() - centery)); this.invalidate(); case MotionEvent.ACTION_UP: - 3 -
46 radius = (float) Math.sqrt((event.getX() - centerx) 47 * (event.getx() - centerx) + (event.gety() - centery) 48 * (event.gety() - centery)); 49 this.invalidate(); 50 51 52 return true; 53 54 55 @Override 56 protected void ondraw(canvas canvas) { 57 super.ondraw(canvas); 58 Paint paint = new Paint(); 59 paint.setantialias(true); 60 paint.setcolor(color.blue); 61 62 canvas.drawcircle(centerx, centery, radius, paint); 63 64 65 18, 19행 main.xml 파일대신재정의한커스텀뷰인 MyView클래스를화면에보여준다. 22행커스텀뷰정의를시작하는부분이다. View를상속받아 MyView 클래스를재정의한다. View에에러가나면 "Ctrl + Shift + O" 를눌러 View 클래스를임포트한다. 24~26행생성자를재정의하는부분이다. 22행의빨간줄이그인 MyView에마우스커서를가져간후 [Add Constructor 'MyView(Context)'] 를선택한다. 28~30행원의중심점과반지름에대한변수를선언하고초기화한다. 33~53행 ontouchevent() 메소드를재정의한다. MyView 안의빈공간에마우스커서를데고, 마우스오른쪽버튼을눌러 [Source]-[Override/Implement Methods...] 팝업메뉴를선택한다. [Override/Implement Methods] 대화상자가나오면 [ontouchevent(motionevent event)] 를체크하고 <OK> 버튼을클릭하여추가한후코딩한다. 35~38행터치된화면의점의좌표를 (centerx, centery) 에저장한다. 40~43행, 46~49행화면이드래그될때와화면에서손을떼었을때반지름을계산한다. invalidate() 메소드를수행하면 ondraw() 메소드가수행되어화면을다시그려준다. 56~62행 ondraw() 메소드를재정의한다. MyView 안의빈공간에마우스커서를데고, 마우스오른쪽버튼을눌러 [Source]-[Override/Implement Methods...] 팝업메뉴를선택한다. [Override/Implement Methods] 대화상자가나오면 [ondraw(canvas)] 를체크하고 <OK> 버튼을클릭하여추가한후코딩한다. 원을그려주는모듈이들어가있다. - 4 -
[ 그림 6-1] 실행화면 위젯클릭이벤트 [ 예제 6-2]main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" - 5 -
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 android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=". 프로젝트명Activity" > <LinearLayout android:layout_width="match_parent" android:gravity="center_horizontal" android:orientation="horizontal" > android:id="@+id/btnred" android:layout_width="wrap_content" android:text="red" /> android:id="@+id/btngreen" android:layout_width="wrap_content" android:text="green" /> android:id="@+id/btnblue" android:layout_width="wrap_content" android:text="blue" /> </LinearLayout> <TextView android:id="@+id/tvtext" android:layout_width="wrap_content" android:layout_gravity="center" android:text="color" android:textsize="20dp" /> </LinearLayout> [ 예제 6-3] 프로젝트명 Activity.java - 6 -
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 package com.example. 프로젝트명 ; import android.app.activity; import android.graphics.color; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.textview; public class 프로젝트명Activity extends Activity { Button btnred, btngreen, btnblue; TextView tvtext; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); btnred = (Button) findviewbyid(r.id.btnred); btngreen = (Button) findviewbyid(r.id.btngreen); btnblue = (Button) findviewbyid(r.id.btnblue); tvtext = (TextView) findviewbyid(r.id.tvtext); btnred.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view arg0) { tvtext.settextcolor(color.red); tvtext.settext("red"); ); btngreen.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view arg0) { tvtext.settextcolor(color.green); tvtext.settext("green"); ); - 7 -
41 42 43 44 45 46 47 48 49 50 btnblue.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view arg0) { tvtext.settextcolor(color.blue); tvtext.settext("blue"); ); [ 그림 6-2] 실행화면 - 8 -
[ 예제 6-4]main.xml 1 ~~~~ 중간생략 ~~~~~ 2 3 android:id="@+id/btnred" 4 android:layout_width="wrap_content" 5 6 android:onclick="onclick" 7 android:text="red" /> 8 ~~~~ 중간생략 ~~~~~ 6행버튼위젯에 onclick 속성을설정하였다. 동일한방법으로 2개의버튼에도설정한다. 프로그램을실행하여버튼을클릭하면 onclick() 메소드가호출된다. [ 예제 6-5] 프로젝트명Activity.java 1 package com.example. 프로젝트명 ; 2 3 import android.app.activity; 4 import android.graphics.color; 5 import android.os.bundle; 6 import android.view.view; 7 import android.widget.textview; 8 9 public class 프로젝트명Activity extends Activity { 10 11 TextView tvtext; 12 13 @Override 14 protected void oncreate(bundle savedinstancestate) { 15 super.oncreate(savedinstancestate); 16 setcontentview(r.layout.main); 17 18 19 public void onclick(view v) { 20 switch (v.getid()) { 21 case R.id.btnRed: 22 tvtext.settextcolor(color.red); - 9 -
23 tvtext.settext("red"); 24 25 case R.id.btnGreen: 26 tvtext.settextcolor(color.green); 27 tvtext.settext("green"); 28 29 case R.id.btnBlue: 30 tvtext.settextcolor(color.blue); 31 tvtext.settext("blue"); 32 33 34 35 17~32행 XML에서설정한 onclick 속성에대한메소드를구현하였다. 18행 v.getid() 메소드를통해버튼의 ID를가져와어떤버튼이클릭되었는지알수있다. 2) 활동하기 활동개요 활동과정 - 10 -
[ 예제 6-6]MyView.java 1 package com.example.event; 2 3 import android.content.context; 4 import android.graphics.canvas; 5 import android.graphics.color; 6 import android.graphics.paint; 7 import android.util.attributeset; 8 import android.view.motionevent; 9 import android.view.view; 10 11 public class MyView extends View { 12 13 14 15 public MyView(Context context, AttributeSet attrs) { super(context, attrs); 16 17 18 19 final static int LINE = 1, CIRCLE = 2, RECT = 3; static int shape = LINE; static int color = Color.RED; 20 float startx = 0; // 시작점 X좌표 21 float starty = 0; // 시작점 Y좌표 22 float endx = 0; // 끝점 X좌표 23 float endy = 0; // 끝점 Y좌표 24 float radius = 0; // 반지름 25 26 @Override 27 28 29 30 31 public boolean ontouchevent(motionevent event) { switch (event.getaction()) { case MotionEvent.ACTION_DOWN: startx = event.getx(); starty = event.gety(); - 11 -
32 33 case MotionEvent.ACTION_MOVE: 34 case MotionEvent.ACTION_UP: 35 endx = event.getx(); 36 endy = event.gety(); 37 this.invalidate(); 38 39 40 return true; 41 42 43 @Override 44 protected void ondraw(canvas canvas) { 45 super.ondraw(canvas); 46 47 Paint paint = new Paint(); 48 paint.setcolor(color); 49 50 switch(shape){ 51 case LINE: 52 canvas.drawline(startx, starty, endx, endy, paint); 53 54 case CIRCLE: 55 radius = (float) Math.sqrt((startX - endx) 56 * (startx - endx) + (starty - endy) 57 * (starty - endy)); 58 canvas.drawcircle(startx, starty, radius, paint); 59 60 case RECT: 61 canvas.drawrect(startx, starty, endx, endy, paint); 62 63 64 65 17행도형모형에대한상수값선언 18행도형의값을저장하는정적변수를선언하고초기화한다. 19행페인트색상의값을저장하는정적변수를선언하고초기화한다. - 12 -
[ 예제 6-7]main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 tools:context=".eventactivity" > 7 <LinearLayout 8 android:layout_width="match_parent" 9 10 android:orientation="horizontal" > 11 12 android:id="@+id/btnline" 13 android:layout_width="0dp" 14 15 android:layout_weight="1" 16 android:onclick="onclick" 17 android:text=" 선그리기 " /> 18 19 android:id="@+id/btncircle" 20 android:layout_width="0dp" 21 22 android:layout_weight="1" 23 android:onclick="onclick" 24 android:text=" 원그리기 " /> 25 26 android:id="@+id/btnrect" 27 android:layout_width="0dp" 28 29 android:layout_weight="1" - 13 -
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 android:onclick="onclick" android:text=" 사각형 " /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:orientation="horizontal" > android:id="@+id/btnred" android:layout_width="0dp" android:layout_weight="1" android:onclick="onclick" android:text=" 빨강 " /> android:id="@+id/btngreen" android:layout_width="0dp" android:layout_weight="1" android:onclick="onclick" android:text=" 초록 " /> android:id="@+id/btnblue" android:layout_width="0dp" android:layout_weight="1" android:onclick="onclick" android:text=" 파랑 " /> </LinearLayout> <com.example.event.myview android:id="@+id/myview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> - 14 -
[ 예제 6-8]EventActivity.java 1 packge com.example.event; 2 3 import android.app.activity; 4 import android.graphics.color; 5 import android.os.bundle; 6 import android.view.view; 7 import android.widget.textview; 8 9 public class EventActivity extends Activity { 10 11 TextView tvtext; 12 13 @Override 14 protected void oncreate(bundle savedinstancestate) { 15 super.oncreate(savedinstancestate); 16 setcontentview(r.layout.main); 17 18 19 public void onclick(view v) { 20 switch (v.getid()) { 21 case R.id.btnRed: 22 MyView.color = Color.RED; 23 24 case R.id.btnGreen: 25 MyView.color = Color.GREEN; 26 27 case R.id.btnBlue: 28 MyView.color = Color.BLUE; 29 30 case R.id.btnLine: 31 MyView.shape = MyView.LINE; 32 33 case R.id.btnCircle: 34 MyView.shape = MyView.CIRCLE; 35 36 case R.id.btnRect: 37 MyView.shape = MyView.RECT; 38 39-15 -
40 41 [ 그림 6-3] 실행화면 4 배운내용정리 public boolean ontouchevent(motionevent event) { swtich(event.getaction()) { case MotionEvent.ACTION_DOWN: // 화면을터치하였을때 // 화면을터치하였을때해야할작업구현 case MotionEvent.ACTION_MOVE: // 화면을드래그하였때 // 화면을드래그하였을때해야할작업구현 - 16 -
case MotionEvent.ACTION_UP: // 화면에서터치가사라질때 // 화면에서터치가사라질때해야할자업구현 case MotionEvent.ACTION_CANCEL: // 터치가취소될때 // 터치가취소될때해야할작업구현 default: return true; 5 학습확인하기 MotionEvent 1 ACTION_DOWN 2 ACTION_MOVE 3 ACTION_UP 4 ACTION_CANCEL 사용자이벤트 a b c d 6 지식창고 참고문헌 - 17 -
참고사이트 - 18 -