Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测按钮被单击的位置_Java_Android_Android Button - Fatal编程技术网

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);
    }
  });
}