2012-07-27 27 views
32

我正在開發一個客戶端在Android 2.2.2的申請,他要做到以下幾點:如何使用View.OnTouchListener代替的onClick

現在我有一個onClick事件的按鈕,但他不」不喜歡,他想在用戶釋放按鈕時進行檢測。

我找到了View.OnTouchListener我認爲這是我需要使用的,但是,是否有任何可能性將此事件添加到xml中,就像我使用onClick一樣?

<ImageButton 
    android:id="@+id/btnSaveNewGate" 
    android:layout_width="@dimen/btnSaveNewGate_width" 
    android:layout_height="@dimen/btnSaveNewGate_height" 
    android:layout_below="@+id/radioGrGateType" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="@dimen/btnSaveNewGate_marginTop" 
    android:background="@null" 
    android:contentDescription="@string/layout_empty" 
    android:onClick="onSaveNewGateClick" 
    android:scaleType="fitXY" 
    android:src="@drawable/save_gate_selector" /> 

我有兩個問題更多:

這是相關聯的事件,當用戶釋放他的手指?

是否有禁止使用View.OnTouchListener而不是onClick的指導原則?

回答

54

當用戶釋放他的手指時的事件是MotionEvent.ACTION_UP。我不知道是否有任何禁止使用View.OnTouchListener而不是onClick()的指導原則,很可能取決於情況。

下面是一個示例代碼:

imageButton.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP){ 

      // Do what you want 
      return true; 
     } 
     return false; 
    } 
}); 
+4

或者,您可以在event.getAction()上使用開關,例子是MotionEvent.ACTION_UP,MotionEvent.ACTION_DOWN等等。 – 2014-03-04 11:04:07

+1

on one plus one它顯示MotionEvent.ACTION_DOWN而不是點擊 – lionheart 2016-05-16 11:09:43

+0

請注意,如果您在那裏返回false,if子句將永遠不會觸發。請參閱:https://stackoverflow.com/a/20359888/564628 – 2017-05-25 14:31:54

5

當用戶釋放按鈕時,觸發OnClick。但是,如果您仍想使用TouchListener,則需要將其添加到代碼中。它只是:

myView.setOnTouchListener(new View.OnTouchListener() 
{ 
    // Implementation; 
}); 
6

據推測,如果想使用OnTouchListener而非OnClickListener,則需要OnTouchListener的額外功能。這是一個補充答案,以顯示如何使用OnTouchListener的更多細節。

定義監聽

將這個地方你的活動或片段。

private View.OnTouchListener handleTouch = new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       Log.i("TAG", "touched down"); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       Log.i("TAG", "moving: (" + x + ", " + y + ")"); 
       break; 
      case MotionEvent.ACTION_UP: 
       Log.i("TAG", "touched up"); 
       break; 
     } 

     return true; 
    } 
}; 

設置聽者

onCreate設置監聽器(一個活動)或onCreateView(爲一個片段)。

myView.setOnTouchListener(handleTouch); 

注意

  • getXgetY給你的座標相對於視圖(即視圖的左上角)。在移動到視圖左上方時,它們會變爲負值。如果您想要絕對屏幕座標,請使用getRawXgetRawY
  • 您可以使用xy值來確定的事情,例如滑動方向。