2015-06-14 162 views
1

我想知道是否有辦法確切地知道按鈕被點擊的位置,並根據用戶點擊它的位置採取不同的操作。例如:檢測按鈕被點擊的位置

fooBtn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     switch(onClickLocation){ 
      case LEFT: 
       foo(); 
       break; 
      case RIGHT: 
       bar(); 
       break; 
      case MIDDLE: 
       baz(); 
       break; 
     } 
    } 
}); 
+0

水龍頭相對於按鈕的座標和尺寸的座標看起來像是一個合乎邏輯的開始。 – J0e3gan

回答

1

未使用OnClickListenerOnTouchListener爲您提供了一個MotionEvent,您可以使用它來確定發生實際觸摸事件的位置。

例如,我在這裏註冊OnClickListener並於同View(稱爲row)的OnTouchListener

row.setOnClickListener(this); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    row.setOnTouchListener(new View.OnTouchListener() { 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     v 
     .findViewById(R.id.row_content) 
     .getBackground() 
     .setHotspot(event.getX(), event.getY()); 

     return(false); 
    } 
    }); 
} 

在這種情況下,我並不需要知道小部件被感動用於處理點擊,但我確實需要知道小部件被觸摸的位置以調整背景,因此漣漪似乎是從用戶觸摸的位置發出的。從onTouch()返回false意味着我不消耗觸摸事件,因此最終我的onClick()方法也將被調用。

在您的情況,您可以:

  • 做實際工作中onTouch(),或

  • 緩存onTouch()最後看到觸摸點,但不要做工作,直到onClick()

我的直覺告訴我,後者應該給你更好的結果(例如,你不會誤解長按),但我h沒有嘗試過你正在尋找的東西。

+0

這不起作用,因爲它只會從最外層的窗口部件(行)傳遞getId。如何檢測我點擊的兩個子控件中的哪一個(即獲得點擊的子控件的行ID)? – powder366

+0

@ powder366:「這不起作用,因爲它只會從最外層的窗口部件(行)傳遞getId」 - 嗯,這段代碼並沒有使用'getId()'。 「如何檢測我點擊的兩個子部件中的哪一個」 - 在每個部件上調用'setOnTouchListener()'。或者,IIRC,'ViewGroup'上有方法可以讓你在'ViewGroup'中給定x/y座標的子節點。 – CommonsWare

+0

使用setOnTouchListener的作品,但事件到onTouch和它的setHotspot永遠不會被調用,現在似乎我的子視圖onTouch消耗事件,並​​不會將它傳遞到最外面的視圖行。任何想法? – powder366