안드로이드 개발 질문/답변
(글 수 45,052)
private void setupUI() {
if (mControlsMode == MODE_BUTTONS) {
setContentView(R.layout.cmain);
updateMenu(R.id.menuitem_buttons);
ImageButton buttonUp = (ImageButton) findViewById(R.id.button_up);
buttonUp.setOnTouchListener(new DirectionButtonOnTouchListener(0, 1,0));
ImageButton buttonLeft = (ImageButton) findViewById(R.id.button_left);
buttonLeft.setOnTouchListener(new DirectionButtonOnTouchListener(0, 0,-0.5));
ImageButton buttonDown = (ImageButton) findViewById(R.id.button_down);
buttonDown.setOnTouchListener(new DirectionButtonOnTouchListener(0, -1,0));
ImageButton buttonRight = (ImageButton) findViewById(R.id.button_right);
buttonRight.setOnTouchListener(new DirectionButtonOnTouchListener(0, 0,0.5));
ImageButton buttongup = (ImageButton) findViewById(R.id.button_gup);
buttongup.setOnTouchListener(new DirectionButtonOnTouchListener(0.4, 0,0));
ImageButton buttongdown = (ImageButton) findViewById(R.id.button_gdown);
buttongdown.setOnTouchListener(new DirectionButtonOnTouchListener(-0.4, 0,0));
버튼을 터치하게 되면 위에 소스에서 리스너가 작동하여...
밑에있는 소스의 lmod,rmod,smod에 값이 들어가게됩니다.
private class DirectionButtonOnTouchListener implements OnTouchListener {
private double lmod;
private double rmod;
private double smod;
public DirectionButtonOnTouchListener(double l, double r, double s) {
lmod = l;
rmod = r;
smod = s;
}
public boolean onTouch(View v, MotionEvent event) {그리고 버튼을 눌렀을시 switch문을 써서 MotionEvent.ACTION_DOWN으로 처리했습니다.
소스 설명은 주석 처리하겠습니다.
int action = event.getAction();
switch(action&MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN: {
byte power = (byte) mPower; //모터 파워 힘 변수 초기값 80으로 지정해놨음
//실질적 움직임은 r과s입니당...
//power의 값과 받아온 lmod의 값을 곱해서 l,r,s의 값을 정하고.
byte l = (byte) (power*lmod);
byte r = (byte) (power*rmod);
byte s = (byte) (power*smod);
mNXTTalker.motors(l,r,s, mRegulateSpeed, mSynchronizeMotors); //mNXTTalker라는 자바 파일에 3개의 값을 보내게됩니다.
//mNXTTalker는 블루투스 통신을 통해서 nxt와 연결해주고 값을 보내는 자바 파일입니다.
break;
}
밑에 소스는 아시다 시비 누른 버튼을 땟을때와 취소됐을때 l,r,s의 값을 0으로 줘서 nxt를 멈추게 합니다.
case MotionEvent.ACTION_CANCEL:{
mNXTTalker.motors((byte) 0, (byte) 0,(byte) 0, mRegulateSpeed, mSynchronizeMotors);
break;
}
case MotionEvent.ACTION_UP:{
mNXTTalker.motors((byte) 0, (byte) 0,(byte) 0, mRegulateSpeed, mSynchronizeMotors);
break;
}이제 여기서가 문제입니다...제가 알기론 ACTION_POINTER_DOWN은 ACTION_DOWN을 눌렀을시에 화면에 또다른 터치가 들어왔을때로
알고 있습니다.그래서 그대로 ACTION_DOWN의 소스를 그대로 썻습니다..동시에 움직일수있도록 말이죵...그런데
막상 실행해보면 처음 touch는 문제없이 되는데 멀티터치를 위해 한손가락을 더 터치하게 되면 아무런 반응이 없다가
두번째 눌렀던 터치를 때면 멈추게 됩니당...그리고 다시(첫번째 터치는 누른상태구요)두번째 터치를 다시 하게 되면 첫번째 터치값이
그대로 동작이 되는데 이게 왜그런지 도저히 모르겠습니다..ㅜㅜ일주일째 보고는있는데 해결이 안되네용...그래서 이렇게 도움을
요청해 봅니당...
case MotionEvent.ACTION_POINTER_DOWN:{
byte power = (byte) mPower;
byte l = (byte) (power*lmod);
byte r = (byte) (power*rmod);
byte s = (byte) (power*smod);
mNXTTalker.motors(l,r,s,mRegulateSpeed, mSynchronizeMotors);
break;
}ACTION_POINTER_UP을 끝으로 소스는 마무리가 됩니다...ACTION_POINTER_UP은 ACTION_POINTER_DOWN을 땟을시 동작이
되는걸로 알고있습니다.그래서 이것도 마찬가지로 0의값을줬습니다..
case MotionEvent.ACTION_POINTER_UP:{
mNXTTalker.motors((byte) 0, (byte) 0,(byte) 0, mRegulateSpeed, mSynchronizeMotors);
break;
}
}
return true;
}
}



멀티 터치라는게 손가락 두개 이상이 눌리는건데...
ACTION_DOWN과 ACTION_POINTER_DOWN이 같다면, 손가락 한개랑 두개랑 하는 역할이 뭐가 다른거죠?