2015-06-14 110 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