반응형
Android(안드로이드) 에서 터치이벤트와 트랙볼 이벤트 처리
개발환경 : JDK 1.5, window XP, android SDK 1.6
이번 예제는 터치이벤트와 트랙볼(Trackball) 이벤트에 대한 내용이다.
터치는 화면을 클릭했을 때 좌표값과 클릭 액션이 UP, DOWN, MOVE 인지 문자로 표시를
해준다. 트랙볼도 마찬가지로 어떤 액션이 실행 되었을지 판단해서 문자열로 표시해주는
간단한 예제이다.
화면 Touch Event 는 View 클래스의 onTouchEvent 를 override 해서 사용한다.
그리고 invalidate() 를 이용해 화면을 다시 재 로딩하게 된다. invalidate() 의 실행은
onDraw() 함수를 호출하기 떄문에 그 속에 구현을 하면 된다.
저번 터치이벤트 예제는 android.os.Message 클래스를 이용하여 화면을 재로딩 하였지만
이번에는 View 클래스에 기본적으로 내장된 invalidate() 함수를 사용한다.
// 터치이벤트 처리 @Override public boolean onTouchEvent(MotionEvent event) { touchX = (int) event.getX(); touchY = (int) event.getY(); touchAction = event.getAction(); invalidate(); return true; }
트랙볼에 관한 이벤트는 키보드 이벤트와 같은 onKeyDown 함수에서 체크가능하다.
그것을 체크하는 상수값은 KEYCODE_DPAD_XXX 가 붙은 것이다.
파라미터로 넘어온 KeyEvent 값으로 판단가능하다.// 볼 액션 그리기 str = "NONE"; switch (ballAction) { case KeyEvent.KEYCODE_DPAD_LEFT: str = "KEYCODE_DPAD_LEFT"; break; case KeyEvent.KEYCODE_DPAD_RIGHT: str = "KEYCODE_DPAD_RIGHT"; break; case KeyEvent.KEYCODE_DPAD_UP: str = "KEYCODE_DPAD_UP"; break; case KeyEvent.KEYCODE_DPAD_DOWN: str = "KEYCODE_DPAD_DOWN"; break; case KeyEvent.KEYCODE_DPAD_CENTER: str = "KEYCODE_DPAD_CENTER"; break; }
전체소스 |
Activity 메인 소스
public class MainTouch extends Activity{ // 터치뷰 private TouchView touchView; // 정기처리핸들러 private TickHandler tickHandler; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); requestWindowFeature(Window.FEATURE_NO_TITLE); touchView = new TouchView(this); setContentView(touchView); } }
TouchView 전체 소스
import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; public class TouchView extends View { private int touchX = 0; // 터치X좌표 private int touchY = 0; // 터치Y좌표 private int touchAction = -999;// 터치액션 private int ballAction = -999; // 볼액션 // 터치액션 그리기 int downX = 0, downY = 0; int moveX = 0, moveY = 0; int upX = 0, upY = 0; int cancelX = 0, cancelY = 0; // 생성자 public TouchView(Context context) { super(context); setBackgroundColor(Color.WHITE); // 포커스지정 setFocusable(true); } // 그리기 @Override protected void onDraw(Canvas canvas) { String str; Resources r = getResources(); // 페인트 객체생성 Paint paint = new Paint(); paint.setAntiAlias(true); paint.setTextSize(16); str = "NONE"; if (touchAction == MotionEvent.ACTION_DOWN) { downX = touchX; downY = touchY; } if (touchAction == MotionEvent.ACTION_MOVE) { moveX = touchX; moveY = touchY; } if (touchAction == MotionEvent.ACTION_UP) { upX = touchX; upY = touchY; } if (touchAction == MotionEvent.ACTION_CANCEL) { cancelX = touchX; cancelY = touchY; } // DOWN XY좌표 그리기 canvas.drawText(r.getString(R.string.touch_view_down) + " X=" + downX + ",Y=" + downY, 0, 20 * 1, paint); canvas.drawText(r.getString(R.string.touch_view_move) + " X=" + moveX + ",Y=" + moveY, 0, 20 * 2, paint); canvas.drawText(r.getString(R.string.touch_view_up) + " X=" + upX + ",Y=" + upY, 0, 20 * 3, paint); canvas.drawText(r.getString(R.string.touch_view_cancel) + " X=" + cancelX + ",Y=" + cancelY, 0, 20 * 4, paint); // 볼 액션 그리기 str = "NONE"; switch (ballAction) { case KeyEvent.KEYCODE_DPAD_LEFT: str = "KEYCODE_DPAD_LEFT"; break; case KeyEvent.KEYCODE_DPAD_RIGHT: str = "KEYCODE_DPAD_RIGHT"; break; case KeyEvent.KEYCODE_DPAD_UP: str = "KEYCODE_DPAD_UP"; break; case KeyEvent.KEYCODE_DPAD_DOWN: str = "KEYCODE_DPAD_DOWN"; break; case KeyEvent.KEYCODE_DPAD_CENTER: str = "KEYCODE_DPAD_CENTER"; break; } canvas.drawText(r.getString(R.string.touch_ball_action) + str, 0, 20 * 7, paint); } // 터치이벤트 처리 @Override public boolean onTouchEvent(MotionEvent event) { touchX = (int) event.getX(); touchY = (int) event.getY(); touchAction = event.getAction(); invalidate(); return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { ballAction = keyCode; invalidate(); return super.onKeyDown(keyCode, event); } }
빠진부분 추가 했습니다.
//==== MessageList class =====// public class MessageList { public static final int MSG_REFRESH = 1; } //==== string.xml ====//Hello World, MainTouch! Touch Event 트랙볼 액션 : 화면터치 Down 좌표 : 화면터치 Move 좌표 : 화면터치 UP 좌표 : 화면터치 Cancel 좌표 :
반응형
'안드로이드 개발' 카테고리의 다른 글
안드로이드에서 단위테스트를 위한 Junit 사용하기 (2) (0) | 2010.08.07 |
---|---|
안드로이드에서 단위테스트를 위한 Junit 사용하기 (1) (1) | 2010.08.07 |
안드로이드 (android) 플러그인과 SDK 가 업데이트 에러 날 때 (1) | 2010.08.04 |
구글에서 GMail 계정을 이용해 SMTP 로 안드로이드 메일보내기 (49) | 2010.08.02 |
안드로이드 SDK 버전에 따른 전세계 사용자 분석(2.1 사용자 4/1 이상) (0) | 2010.08.02 |
안드로이드(Android) - 저장된 이미지를 불러와 갤러리 기능 구현 (84) | 2010.08.02 |
안드로이드 OS VMWare 설치하기 (8) | 2010.08.02 |
iMac(맥) 에서 화면 캡쳐하기 (0) | 2010.08.02 |