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。

下面記錄一個範本,供大家使用。

@Override
  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);
              
             }

留言

這個網誌中的熱門文章

python 找圖自動點擊

Python pyserial 抓取系統內的 COM PORT

VBA EXCEL 工作表變化 馬上執行 的作法 Worksheet_Change