2013-02-06 34 views
7

我想檢測一個雙擊但是沒有先觸發一次點擊。我嘗試過雙擊監聽器,但是在檢測到雙精度之前總是得到一個onSingleTapUp,這是合理的我猜。但在我的應用程序中,我真的不希望單擊回撥時,雙擊的方式。Android檢測雙擊不先點擊一下

我意識到沒有應用程序可以預測未來(或者我會非常有錢),但我在想,只需單擊一次即可啓動計時器,如果在某段時間內沒有雙擊,那麼請單擊。但這似乎不起作用,因爲一旦我啓動計時器並且計時器正在運行,第二次敲擊就不會生成事件。這裏是我的代碼使用一個異步任務,我也嘗試了一個計時器。

mGD = new GestureDetector(getContext(), new SimpleOnGestureListener() { 

      @Override 
      public boolean onSingleTapUp(MotionEvent ev) { 
       //Log.d("KitView", "onSingleTapUp "+ev.toString()); 

       class DblTapTask extends AsyncTask<Void, Void, Void> { 

        @Override 
        protected void onPreExecute() { 
         Log.d("KitView", "onPreExecute"); 
        } 

        protected Void doInBackground(Void... args) { 
         Log.d("KitView", "doInBackground"); 
         try { 
          Thread.sleep(1000); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         return null; 
        } 

        protected void onPostExecute(Void result) { 
         Log.d("KitView", "onPostExecute"); 
              doSigleTapAction(); 
         mDblTapTask=null; 
        } 
       }; 

       if(mDblTapTask==null) { 
        Log.d("KitView", "START TASK"); 
        mDblTapTask = new DblTapTask(); 
        mDblTapTask.execute(); 
       } else { 
        Log.d("KitView", "TASK RUNNING"); 
            doDoubleTapAction(); 
       } 


       Log.d("KitView", "onSingleTapUp DONE"); 
       return true; 
      } // end onSingleTapUp 

     });  // end new GestureDetector 

在這個例子中,我在onSingleTapUp上就第一次點擊就好了。我的超時是1秒在doInBackground測試,所以我有很多時間做第二次水龍頭。注意Log.d(「KitView」,「onSingleTapUp DONE」);立即運行我做第一次水龍頭,所以onSingleTapUp不掛。

現在的問題是,在1sec內再次錄音什麼也不做。在睡眠完成並且onPostExecute已經運行之前,沒有對onSingleTapUp的調用。所以Log.d(「KitView」,「TASK RUNNING」);從來沒有發生這是我會發現雙擊與單擊當然的地方。

我不知道爲什麼aynctask阻止事件,任何想法?謝謝

+0

嘗試使用http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html –

回答

10

我很困惑你想達到的目標。雙擊方法onDoubleTap()在單擊時不會被調用。另一方面,對於每一次雙擊,都有兩個相關聯的單擊方法調用onSingleTapUp()

如果您想區分它們,您可以使用onSingleTapConfirmed(),這是觸發手勢時檢測器確定水龍頭單一。請參閱參考:

發生單擊時通知。

不像OnGestureListener.onSingleTapUp(MotionEvent),這纔會被調用後,探測器有信心,用戶的第一抽頭後面沒有第二次敲擊導致雙擊手勢

然後,您可以在使用此方法調用與boolean標誌組合以實質上檢測任何類型的單/雙擊。

+0

是的,我剛剛發現onSingleTapConfirmed也是,謝謝 – steveh

+0

@steveh lol:D快樂的編碼! – andr

5

請試試如下:

您可以使用手勢檢測器。請參閱以下代碼:

public class MyView extends View { 

GestureDetector gestureDetector; 

public MyView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
      // creating new gesture detector 
    gestureDetector = new GestureDetector(context, new GestureListener()); 
} 

// skipping measure calculation and drawing 

    // delegate the event to the gesture detector 
@Override 
public boolean onTouchEvent(MotionEvent e) { 
    return gestureDetector.onTouchEvent(e); 
} 


private class GestureListener extends GestureDetector.SimpleOnGestureListener { 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 
    // event when double tap occurs 
    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     Log.d("Double Tap", "Tapped Occured."); 
     return true; 
    } 
} 
} 

您可以覆蓋偵聽器的其他方法以獲得單擊,flinges等。

+0

當然,這就是我現在正在做的,問題是如果我添加onSingleTapUp(MotionEvent ev),將始終在onDoubleTap之前調用,這不是我想要的。 – steveh

+1

作爲「andr」建議你應該嘗試一下單擊TapSingleTapConfirmed()。由於雙擊是兩個單擊的組合。 – AAnkit

1

我想我已經想通了

@Override 
      public boolean  onSingleTapConfirmed(MotionEvent e) { 
       Log.d("KitView", "onSingleTapConfirmed"); 
       return true; 
      } 
      @Override 
      public boolean onDoubleTap(MotionEvent e) { 
       Log.d("KitView", "onDoubleTap"); 
       return true; 
      } 

當我做了雙擊,好和易於

+1

我猜你以前沒有看到我的解決方案;) – andr

+0

謝謝,我已經接受它了 – steveh

0

你可以參考自爆onSingleTapConfirmed不叫: 覆蓋的onTouchEvent()基法

在第一次下降時,我們應該記錄下時間。 當第二次進入時,我們比較最後一次停機時間,如果它們在150ms或更短時間內,我們會發出一個消息,表明它是雙擊。