반응형
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 |

