Android(안드로이드) 에서 터치이벤트와 트랙볼 이벤트 처리

안드로이드 개발

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 좌표 : 

Posted by 녹두장군