onTouchEvent 單點與多點觸控
以下是一個onTouchEvent的程式寫法,
如果是public void onTouchEvent(MotionEvent event) , 最後要super.onTouchEvent(event);
如果是public boolean onTouchEvent(MotionEvent event) , 最後要return true, 有些時候需要用到return false. 有什麼差別呢?我們舉個例。如果有一個linearlayout,我們已經設定onTouchEvent,當手指在這個linearlayout滑動時,linearlayout會做一件事件A。然後我們在這個linearlayout上放上一張圖片,圖片也有設定onTouchEvent滑動時會做事件B。
那麼當我們在圖片上滑動時,是圖片做事件B,還是linearlayout做事件A?
如果只要做事件B,就要return true, 如果事件A跟B都要做,那就要return false。
public void onTouchEvent(MotionEvent event) {
int movingMode=0;
float xDown=0,yDown=0;
float mX0, mX1, mY0, mY1;
;
switch(event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
xDown=event.getX();
yDown=event.getY();
movingMode=1;
break;
case MotionEvent.ACTION_UP:
movingMode = 0;// 不會一直留在 ACTION_MOVE內
break;
case MotionEvent.ACTION_POINTER_DOWN: //多點觸控
mX0=event.getX(0);
mY0=event.getY(0);
mX1=event.getX(1);
mY1=event.getY(1);
movingMode=2;
break;
case MotionEvent.ACTION_POINTER_UP: //多點觸控之action up
movingMode=0; // 不會一直留在 ACTION_MOVE內
break;
case MotionEvent.ACTION_MOVE:
if (movingMode==1){
//做一些事
xDown=event.getX(); //不斷的存回座標
yDown=event.getY(); //不斷的存回座標
}else if(movingMode==2){
float mmX0=event.getX(0);
float mmX1=event.getX(1);
float mmY0=event.getY(0);
float mmY1=event.getY(1);
//比對 action pointer down 時,X座標哪一個座標在左,哪一個座標在右
if(mX0<=mX1){
//做些事
}else{
//做些事
}
//比對action pointer down 時,Y座標哪一個座標在上,哪一個座標在下
if(mY0<=mY1){
//做些事
}else{
//做些事
}
mX0=mmX0; //不斷的存回座標
mX1=mmX1; //不斷的存回座標
mY0=mmY0; //不斷的存回座標
mY1=mmY1; //不斷的存回座標
}
}
break;
}
super.onTouchEvent(event);
}
如果是public void onTouchEvent(MotionEvent event) , 最後要super.onTouchEvent(event);
如果是public boolean onTouchEvent(MotionEvent event) , 最後要return true, 有些時候需要用到return false. 有什麼差別呢?我們舉個例。如果有一個linearlayout,我們已經設定onTouchEvent,當手指在這個linearlayout滑動時,linearlayout會做一件事件A。然後我們在這個linearlayout上放上一張圖片,圖片也有設定onTouchEvent滑動時會做事件B。
那麼當我們在圖片上滑動時,是圖片做事件B,還是linearlayout做事件A?
如果只要做事件B,就要return true, 如果事件A跟B都要做,那就要return false。
下面記錄一個範本,供大家使用。
@Overridepublic void onTouchEvent(MotionEvent event) {
int movingMode=0;
float xDown=0,yDown=0;
float mX0, mX1, mY0, mY1;
;
switch(event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
xDown=event.getX();
yDown=event.getY();
movingMode=1;
break;
case MotionEvent.ACTION_UP:
movingMode = 0;// 不會一直留在 ACTION_MOVE內
break;
case MotionEvent.ACTION_POINTER_DOWN: //多點觸控
mX0=event.getX(0);
mY0=event.getY(0);
mX1=event.getX(1);
mY1=event.getY(1);
movingMode=2;
break;
case MotionEvent.ACTION_POINTER_UP: //多點觸控之action up
movingMode=0; // 不會一直留在 ACTION_MOVE內
break;
case MotionEvent.ACTION_MOVE:
if (movingMode==1){
//做一些事
xDown=event.getX(); //不斷的存回座標
yDown=event.getY(); //不斷的存回座標
}else if(movingMode==2){
float mmX0=event.getX(0);
float mmX1=event.getX(1);
float mmY0=event.getY(0);
float mmY1=event.getY(1);
//比對 action pointer down 時,X座標哪一個座標在左,哪一個座標在右
if(mX0<=mX1){
//做些事
}else{
//做些事
}
//比對action pointer down 時,Y座標哪一個座標在上,哪一個座標在下
if(mY0<=mY1){
//做些事
}else{
//做些事
}
mX0=mmX0; //不斷的存回座標
mX1=mmX1; //不斷的存回座標
mY0=mmY0; //不斷的存回座標
mY1=mmY1; //不斷的存回座標
}
}
break;
}
super.onTouchEvent(event);
}
留言
張貼留言