第二天写开发日志,嗯……
今天还是在做那个智能小船的控制器。昨天做完了消息队列,今天处理了长按按钮连续触发事件的问题。目前长按已经可以连续触发事件了,具体消息处理还没有写。
连续触发主要是用OnTouchListener来监听MotionEvent.ACTION_DOWN和MotionEvent.ACTION_UP事件。当监听到按钮按下时启动一个新线程,持续作出响应,然后当监听到抬起事件后把这个线程结束掉。
线程的创建和结束可以使用Thread类来处理,不过使用ScheduledExecutorService也是个不错的方案。
这是我的主要参考链接:http://blog.csdn.net/u010983881/article/details/49927411
出于备忘目的,贴上本段的核心代码:
目前只是按下按钮后简单的每100ms发UDP包,具体的操作内容尚待添加。
设定监听器:
/* Create the OnTouchListener of motion control button, such as WASD. Call callback_motionUpdate to handle all event. */ View.OnTouchListener ctlBtnListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return callback_motionUpdate(v, event); } }; //Set OnTouchListener of motion control button, such as WASD. findViewById(R.id.btnDown).setOnTouchListener(ctlBtnListener); findViewById(R.id.btnUP).setOnTouchListener(ctlBtnListener); findViewById(R.id.btnLeft).setOnTouchListener(ctlBtnListener); findViewById(R.id.btnRight).setOnTouchListener(ctlBtnListener);
/** * A pointer class point to ScheduledExecutorService class */ private class pScheduledExecutorService { ScheduledExecutorService SES; } // 4 ScheduledExecutorService pointer private pScheduledExecutorService up = new pScheduledExecutorService(), down = new pScheduledExecutorService(), left = new pScheduledExecutorService(), right = new pScheduledExecutorService(); //The Callback Function of WASD. private boolean callback_motionUpdate(View view, MotionEvent event) { pScheduledExecutorService thisSES; switch (view.getId()) { case R.id.btnUP: thisSES = up; break; case R.id.btnDown: thisSES = down; break; case R.id.btnLeft: thisSES = left; break; case R.id.btnRight: thisSES = right; break; default: return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: thisSES.SES = Executors.newSingleThreadScheduledExecutor(); thisSES.SES.scheduleWithFixedDelay(new Runnable() { @Override public void run() { //TODO Change the Var of Status. ctlMsgSender.mHandler.sendEmptyMessage(msgType.ctlUpdate); } }, 0, 100, TimeUnit.MILLISECONDS); //每间隔100ms发送Message break; case MotionEvent.ACTION_UP: if (thisSES.SES != null) { thisSES.SES.shutdownNow(); thisSES.SES = null; } break; default: return false; } ctlMsgSender.mHandler.sendEmptyMessage(msgType.ctlUpdate); return false; }