Java 检测按钮被单击的位置
我想知道是否有一种方法可以准确地知道按钮被点击的位置,并根据用户点击的位置采取不同的操作。比如:Java 检测按钮被单击的位置,java,android,android-button,Java,Android,Android Button,我想知道是否有一种方法可以准确地知道按钮被点击的位置,并根据用户点击的位置采取不同的操作。比如: fooBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { switch(onClickLocation){ case LEFT: foo();
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;
}
}
});
不使用
OnClickListener
OnTouchListener
为您提供了一个MotionEvent
,可用于确定实际触摸事件发生的位置
例如,这里我在同一个视图
(称为行
)上注册了OnClickListener
和OnTouchListener
:
在这种情况下,我不需要知道小部件在哪里被触摸以处理点击,但我需要知道小部件在哪里被触摸以调整RippleDrawable
背景,因此纹波似乎是从用户触摸的地方发出的。从onTouch()
返回false
意味着我没有使用触摸事件,因此最终也将调用我的onClick()
方法
在您的情况下,可以:
- 在
中执行实际工作,或onTouch()
- 将最后看到的接触点缓存在
中,但在onTouch()
onClick()
我的直觉告诉我,后者会给你更好的结果(例如,你不会误解长时间的点击),但是我还没有尝试做您想要做的事情。点击的坐标与按钮的坐标和尺寸之间的关系似乎是一个合乎逻辑的开始。这不会起作用,因为它只会从最外层的小部件(行)传递getId。我如何检测我的两个子部件中的哪一个被点击(即从第行获取点击子部件的点击getId)?@powder366:“这将不起作用,因为它将只从最外层的部件(第行)传递getId”——嗯,这段代码没有使用
getId()
。“如何检测两个子部件中被单击的是哪一个”--在每个部件上调用setOnTouchListener()
。或者,IIRC,ViewGroup
上有一些方法可以在ViewGroup
中的给定x/y坐标处为您提供子对象。使用setOnTouchListener可以工作,但随后将事件发送到onTouch及其setHotspot从未被调用,现在似乎我的子视图onTouch会使用该事件,而不会将其发送到最外层的视图行。知道吗?我想不出来。当我在onTouch中返回true一次时,onTouch setHotspot从未被调用。我总是返回false,然后设置一个变量,然后在onClick中进行检查,从而解决了这个问题。
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);
}
});
}