android按键连续按下事件处理
2014-09-15 17:15
369 查看
android中有Button控件,针对Button控件有2个非常经典的处理事件那就是1、OnClick,即普通点击事件。
2、长按键事件,即当按键长时间被按下触发的一个事件。
但是我们实际处理中仅仅有他们可能不一定能完全满足我们的需求,例如:
游戏开发中一个移动按键,我们如果要实现按下按键物理持续移动,一直到我们松开按键物体才停止移动。
明显上述的需求,如果用我们的OnClick明显不能满足我们需求,因为必须按一下按键后松开才会触发OnClick,
而长按键事件,则只会触发一次,他也无法判断我们到底什么时候松开,即无法判断我们什么时候才停止移动。
针对上面我们谈到的移动按键需求,我的实现方式如下:
1、对按键进行触摸事件的监测
2、当监测到ACTION_DOWN时,开始开启一个线程一直执行我们的移动动作(当然要有一定睡眠延时)
3、当监测到ACTION_UP时,则将线程给结束
说了这么多原理,屌丝程序员早就不耐烦了吧,好吧那就直接上代码:
public boolean onTouch(final View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isUp = false;
if(isTimeout == true)
{
new Thread(new Runnable() {
@Override
public void run() {
while (!isUp) {
if (gameView != null)
{
switch (v.getId()) {
case R.id.up:
gameView.upMove();
break;
case R.id.shot:
gameView.shot();
break;
case R.id.down:
gameView.downMove();
break;
case R.id.left:
gameView.leftMove();
break;
case R.id.right:
gameView.rightMove();
break;
}
}
if(v.getId()!=R.id.shot)
{
isTimeout = false;
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
isTimeout =true;
}
}
}).start();
}
break;
case MotionEvent.ACTION_UP:
isUp = true;
break;
default:
break;
}
return false;
}
2、长按键事件,即当按键长时间被按下触发的一个事件。
但是我们实际处理中仅仅有他们可能不一定能完全满足我们的需求,例如:
游戏开发中一个移动按键,我们如果要实现按下按键物理持续移动,一直到我们松开按键物体才停止移动。
明显上述的需求,如果用我们的OnClick明显不能满足我们需求,因为必须按一下按键后松开才会触发OnClick,
而长按键事件,则只会触发一次,他也无法判断我们到底什么时候松开,即无法判断我们什么时候才停止移动。
针对上面我们谈到的移动按键需求,我的实现方式如下:
1、对按键进行触摸事件的监测
2、当监测到ACTION_DOWN时,开始开启一个线程一直执行我们的移动动作(当然要有一定睡眠延时)
3、当监测到ACTION_UP时,则将线程给结束
说了这么多原理,屌丝程序员早就不耐烦了吧,好吧那就直接上代码:
public boolean onTouch(final View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isUp = false;
if(isTimeout == true)
{
new Thread(new Runnable() {
@Override
public void run() {
while (!isUp) {
if (gameView != null)
{
switch (v.getId()) {
case R.id.up:
gameView.upMove();
break;
case R.id.shot:
gameView.shot();
break;
case R.id.down:
gameView.downMove();
break;
case R.id.left:
gameView.leftMove();
break;
case R.id.right:
gameView.rightMove();
break;
}
}
if(v.getId()!=R.id.shot)
{
isTimeout = false;
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
isTimeout =true;
}
}
}).start();
}
break;
case MotionEvent.ACTION_UP:
isUp = true;
break;
default:
break;
}
return false;
}
相关文章推荐
- Android面面观——Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
- Android事件处理--按键
- Android按键事件处理流程 -- KeyEvent
- Android按键事件处理流程 -- KeyEvent
- Android按键事件处理流程 -- KeyEvent
- Android面面观——Android事件处理下(按键、触摸屏和滚动球)
- Android按键事件处理流程 -- 从事件被派发到View层次结构的根节点DecorView开始分析
- Android 按键事件处理详解
- Android按键拦截处理最佳实践范例(以Back事件为例)
- android按键事件和触屏事件(四)-listview的setOnItemClickListener点击无效的处理
- Android游戏开发教程之十四:按键中断事件的处理
- Android按键事件处理分析 .
- android学习笔记5 android按键事件处理代码走读[framework]
- Android按键事件处理流程 -- KeyEvent
- (转载)收集android事件处理,按键、触摸屏部分
- Android面面观——Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
- Android开发--事件的处理/按键按下,弹起,触摸事件等
- Android游戏开发框架(四)按键事件处理
- <Android>长按事件的连续处理
- Android+按键事件处理详解