2017-07-21 43 views
-1

這是我爲我的onTouchListener使得代碼:我需要讓我的應用程序支持雙指縮放,但不能雙擊

if(event.getAction() == MotionEvent.ACTION_UP) { 
       Log.i("", "double touch : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch)); 
       if (System.currentTimeMillis() - timeLastTouch < 500) { 
        Log.i("", "double touch TRUE"); 
        timeLastTouch = System.currentTimeMillis(); 
        return true; 
       } else { 
        Log.i("", "double touch FALSE"); 
        timeLastTouch = System.currentTimeMillis(); 
        return false; 
       } 
      }else if(event.getAction() == MotionEvent.ACTION_DOWN) { 
       Log.i("", "double touch DOWN : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch)); 
       if (System.currentTimeMillis() - timeLastTouch < 500) { 
        Log.i("", "double touch TRUE DOWN"); 
        timeLastTouch = System.currentTimeMillis(); 
        return true; 
       }else { 
        Log.i("", "double touch FALSE DOWN"); 
        return false; 
       } 
      }else { 
       timeLastTouch = System.currentTimeMillis(); 
       Log.i("","double touch ELSE FALSE"); 
       return false; 
      } 

但它不工作。 此視圖位於Surface視圖上方。現在我只需要將事件發送到SurfaceView進行捏合(捏到放大) 現在我試着製作邏輯,這樣如果它有雙重觸摸,那麼我將返回true(它消耗了觸摸,所以然後表面查看,沒有得到觸摸)。 但是,如果我這樣做,捏縮放無法使用。 如果我刪除這個邏輯,捏縮放,工作,所以我添加了一些日誌,並跟着他們。我注意到,對於縮放縮放,你會得到2個向下的事件,並且只有在調用ACTION_MOVE之後。據推測,因爲當你捏縮放,你放下2個手指,然後縮放。我的問題是,我的代碼設置它,爲第二個Action_down消耗觸摸,這意味着捏開始縮放不開始。任何ideeas如何解決這個問題?

+0

你可能想看看[現有的捏實施](https://android-arsenal.com/search?q=pinch),看看他們是如何做到的。 – CommonsWare

+0

那麼,我不需要執行捏合邏輯。已經存在。在低於我的觀點的觀點上。我想要的就是讓我的觀點消耗雙擊的觸感,但不是捏。 (記錄event.action)返回:0 0 1(action_down,action_down,action_up)用於雙擊,並返回0 0 2/1(action_down,action_down,move或up)用於捏。因此我的問題。原因如果我阻止第二個Action_down事件,我將無法獲得縮放。如果我不阻止它,它將被髮送到下一個視圖,並且不會發生 –

+0

因此,我需要一個邏輯來知道在「移動」的MotionEvent被調用之前何時發生捏縮放。我嘗試使用event.getIndexCounter()或檢查它是否是多點觸摸,但它只爲我返回1 –

回答

0

我也能做到這一點,有以下邏輯:

viewTop.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.i("","double touch event action: ==========================="); 
      Log.i("","double touch event action:" + event.getAction()); 
      if(event.getAction() == MotionEvent.ACTION_DOWN) { 
       Log.i("", "double touch DOWN : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch) + "..... location diff: " + (event.getX() - xLastTouch)); 
       if (System.currentTimeMillis() - timeLastTouch < 1000 && Math.abs(event.getX() - xLastTouch) < 150 && Math.abs(event.getY() - yLastTouch) < 150) { 
        Log.i("", "double touch TRUE DOWN"); 
        timeLastTouch = System.currentTimeMillis(); 
        xLastTouch = event.getX(); 
        yLastTouch = event.getY(); 
        return true; 
       } else { 
        timeLastTouch = System.currentTimeMillis(); 
        xLastTouch = event.getX(); 
        yLastTouch = event.getY(); 
        Log.i("", "double touch FALSE DOWN"); 
        return false; 
       } 
      }else if(event.getAction() == MotionEvent.ACTION_UP) { 
       timeLastTouch = System.currentTimeMillis(); 
       xLastTouch = -1f; 
       yLastTouch = -1f; 
       return false; 
      }else { 
       timeLastTouch = System.currentTimeMillis(); 
       xLastTouch = event.getX(); 
       yLastTouch = event.getY(); 
       Log.i("","double touch ELSE FALSE"); 
       return false; 
      } 
     } 
    }); 

但是,如果我雙擊,第二接頭是在另一個地方,它會發生。對此不太高興,所以我需要更多地瞭解這一點,所以我不會接受這個答案。我在某種程度上需要知道,如果我在第二個Action_Down中使用或不使用這個,那麼在這個pinch調用action_move之前。