点击获取X和Y坐标

4

我曾经使用过一个 onTouchListener,但我需要将其更改为 onClickListener,因为我不想长时间的触摸记录与短时间触摸不同的值。在我的代码中的一行中,我有 X[i]=Integer.valueOf((int)event.getX());,它在 onTouchListener 中运行得非常完美,但是在 onClickListener 中,我会收到错误信息 event cannot be resolved

我的问题是,在 onClickListener 中是否有 event.getX() 函数?

这是我的代码部分:

    touchLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            X[i]=Integer.valueOf((int)event.getX());
        }
    });
}

感谢您的提前帮助。
3个回答

14

我相信你无法获取点击的x和y坐标,因为OnClick是由视图的触摸监听器的内部实现触发的事件。它在用户抬起手指并且没有移动超过一定距离(称为触摸阈值)时被触发。

另一方面,如果您实现自己的触摸监听器,您可以检测触摸手势的起始和结束位置,并对这些坐标执行任何需要的操作。代码可能如下:

    view.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                startX = (int) event.getX();
                startY = (int) event.getY();
            }

            if (event.getAction() == MotionEvent.ACTION_UP) {
                int endX = (int) event.getX();
                int endY = (int) event.getY();
                int dX = Math.abs(endX - startX);
                int dY = Math.abs(endY - startY);


                if (Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2)) <= touchSlop) {
                    // Your on click logic here...
                    return true;
                }
            }
       return false;
    }
});

这里的touchSlop变量表示手势被认为是滚动之前可以移动的距离。您可以通过调用ViewConfiguration.get(context).getScaledTouchSlop()来获取此值。


1
在 // Your on click logic here... 下面应该返回 true; 但是在方法的结尾处,你应该返回 false。 - Sirelon

5

你可能需要查看以下内容,这可能会对你有所帮助:

@Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int)event.getX();
        int y = (int)event.getY();
        switch (event.getAction()) {

            case MotionEvent.ACTION_MOVE:
                 Log.i("222","X-"+x+"===Y="+y);

        }
    return false;
    }

-1
你可以试试这个。
      public void onClick(View view) {
        int[] values = new int[2]; 
        view.getLocationOnScreen(values);
        Log.d("X & Y",values[0]+" "+values[1]);
    }

在方法中

      getLocationOnScreen(values);

你可以按照自己的需求进行操作。如果在你的情况下无法正常工作,请告诉我。


3
这是因为 View 中 "getLocationOnScreen" 方法返回的数值是视图最左上角的点,而不是实际被触摸的点。 - Marche101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接