因为最近项目中需要实现一个长按Button然后移动的功能,就花了点时间把包括触碰、点击和长按一系列手势事件看了一下。
1.触碰事件
代码片段
button.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent arg1) {
if(arg1.getAction()==MotionEvent.ACTION_DOWN){
Log.i(TAG, "OnTouchListener + down");
return false;
}else if(arg1.getAction()==MotionEvent.ACTION_UP){
Log.i(TAG, "OnTouchListener + up");
return false;
}else {
Log.i(TAG, "OnTouchListener + move");
return false;
}
}
});
Touch事件可分为三个过程:ACTION_DOWN、ACTION_MOVE、ACTION_UP,而ACTION_MOVE涉及到一系列关于坐标变化的问题,比如将一个Button或者一张图片进行移动,其实就是通过setX()和setY()对View的进行坐标的设定,具体的内容可以参照小Demo大知识-控制Button移动来学Android坐标
2.点击、长按事件
代码片段
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Log.i(TAG, "OnClickListener");
}
});
button.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View arg0) {
Log.i(TAG, "OnLongClickListener");
return false;
}
});
由于涉及到的内容比较少,这里就把它们放在一起了。
下面重点对Touch事件的返回值return进行分析。
return值决定了在执行完Touch事件后是否继续响应短按或长按(也就是click或Longclick),return true则不执行,return false则继续等待响应,简而言之就是一旦return true那么点击(或长按)事件就无效了。
3.测试
3.1
public boolean onTouch(View arg0, MotionEvent arg1) {
if(arg1.getAction()==MotionEvent.ACTION_DOWN){
Log.i(TAG, "OnTouchListener + down");
return true;
}else if(arg1.getAction()==MotionEvent.ACTION_UP){
Log.i(TAG, "OnTouchListener + up");
return false;
}else {
Log.i(TAG, "OnTouchListener + move");
return false;
}
}
当ACTION_DOWN返回true时,表示对按下Button这个动作不响应,短按和长按都不响应:
I/MainActivity: OnTouchListener + down
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + up
I/MainActivity: OnTouchListener + down
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + up
I/MainActivity: OnTouchListener + down
可见只有Touch事件响应。
3.2
public boolean onTouch(View arg0, MotionEvent arg1) {
if(arg1.getAction()==MotionEvent.ACTION_DOWN){
Log.i(TAG, "OnTouchListener + down");
return false;
}else if(arg1.getAction()==MotionEvent.ACTION_UP){
Log.i(TAG, "OnTouchListener + up");
return true;
}else {
Log.i(TAG, "OnTouchListener + move");
return false;
}
}
当ACTION_UP返回true时,只有click事件不响应:
I/MainActivity: OnTouchListener + down
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + up
I/MainActivity: OnLongClickListener
I/MainActivity: OnTouchListener + down
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + up
I/MainActivity: OnLongClickListener
3.3
public boolean onTouch(View arg0, MotionEvent arg1) {
if(arg1.getAction()==MotionEvent.ACTION_DOWN){
Log.i(TAG, "OnTouchListener + down");
return false;
}else if(arg1.getAction()==MotionEvent.ACTION_UP){
Log.i(TAG, "OnTouchListener + up");
return false;
}else {
Log.i(TAG, "OnTouchListener + move");
return true;
}
}
当ACTION_MOVE返回true时,三个事件都能有响应。
I/MainActivity: OnTouchListener + down
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnLongClickListener
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + move
I/MainActivity: OnTouchListener + up
I/MainActivity: OnClickListener