지금 블루투스로 데이터 값을 주는 것을 하고 있습니다. (아두이노 탱크 만드는 중)
예를 들어서 처음 터치를 하면 블루투스로 15라는 값을 전송 합니다. 계속 터치를 하다가 일정한 시간 뒤에는 16 이라는 값을 보내어 주려고 합니다. 그리고 터치를 하지 않으면 바로 데이터를 0을 전송합니다.
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
case R.id.forward_button:
if (event.getAction() == MotionEvent.ACTION_DOWN) {
for (int i = 1000; i > 0; i--) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
forward_button.setPressed(true);
AttinyOut = (byte) (AttinyOut | 16);
write(AttinyOut);
i = i-1;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
forward_button.setPressed(false);
AttinyOut = 0;
write(AttinyOut);
break;
}
}
forward_button.setPressed(true);
AttinyOut = 0;
AttinyOut = (byte) (AttinyOut | 15);
write(AttinyOut);
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
forward_button.setPressed(false);
// AttinyOut = (byte) (AttinyOut & 236);
AttinyOut = 0;
write(AttinyOut);
return true;
}
forward_button.setPressed(false);
break;
그런데 for 구문을 주니깐 터치를 하지 않는데도 for 문이 끝 날 때 까지 계속 진행이 되던데 어떻게 해야 될지....
액션다운일때 바로 15날려주시고, 다운일때 핸들러 이용해서 15초 후 날려주시면 됩니다. 만약 UP일때 15초가 아니면 remove 핸들러 해주시면 되구요,
forward_button.setPressed(true);
AttinyOut = 16;
write(AttinyOut);
mHandler.postDelayed(new Runnable() {
public void run() {
AttinyOut = 15;
write(AttinyOut);
}
}, 2000);
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
forward_button.setPressed(false);
int i = 2000;
if (i != 2000) {
mHandler.removeCallbacks(new Runnable() {
public void run() {
AttinyOut = 15;
write(AttinyOut);
}
}
});
AttinyOut = 0;
write(AttinyOut);
return true;
}
이렇게 하는라는 말씀은 아니신듯 한데...이렇게 해도 매난 똑같은 현상이 일어나는...흠...
아 해결했습니다.
private Runnable runnableForward = new Runnable() {
@Override
public void run(){
AttinyOut = 15;
write(AttinyOut);
}
};
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
case R.id.forward_button:
if (event.getAction() == MotionEvent.ACTION_DOWN) {
forward_button.setPressed(true);
AttinyOut = 16;
write(AttinyOut);
mHandler.postDelayed(runnableForward, 2000);
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
forward_button.setPressed(false);
mHandler.removeCallbacks(runnableForward);
AttinyOut = 0;
write(AttinyOut);
return true;
}
forward_button.setPressed(false);
break;
밑줄 친 것으로 바꾸니깐 제대로 작동 합니다 감사합니다~~
Handler에 보면 postDelayed(Runable, long); 메소드가 있습니다. 이걸 사용하시면 long만큼 지난 후에 Runnable메소드가 실행됩니다.