OnClickListener - 事件的x,y位置?

Mar*_*ark 76 android

我有一个从View派生的自定义视图.我希望在单击视图时收到通知,以及点击发生位置的x,y位置.长按也是如此.

看起来这样做,我需要覆盖onTouchEvent().但是,没有办法从OnClickListener相反的方式获取事件的x,y位置吗?

如果不是,有什么好的方法来判断一个动作事件是"真正的"点击还是长按等?将onTouchEvent产生快速连续等许多事件

小智 86

谢谢.这正是我想要的.我现在的代码是:

imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
                textView.setText("Touch coordinates : " +
                        String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
            }
            return true;
        }
    });
Run Code Online (Sandbox Code Playgroud)

这正是马克要求的......

  • onTouch处理程序不应返回`false`,因此它不会阻止触摸事件?(如果侦听器已使用该事件,则View.OnTouchListener.onTouch返回true,否则返回false.) (5认同)
  • 这些坐标是否属于视角? (4认同)
  • 好吧,不是"精确",因为`OnClickListener`在手指被释放时被触发,所以在'ACTION_UP`但有限制:如果执行了伪造(滑动)手势,那么`OnClickListener`不会被触发但是'ACTION_UP`仍将是处理. (4认同)

Sur*_*gch 21

完整的例子

其他答案缺少一些细节.这是一个完整的例子.

public class MainActivity extends AppCompatActivity {

    // class member variable to save the X,Y coordinates
    private float[] lastTouchDownXY = new float[2];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // add both a touch listener and a click listener
        View myView = findViewById(R.id.my_view);
        myView.setOnTouchListener(touchListener);
        myView.setOnClickListener(clickListener);
    }

    // the purpose of the touch listener is just to store the touch X,Y coordinates
    View.OnTouchListener touchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            // save the X,Y coordinates
            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                lastTouchDownXY[0] = event.getX();
                lastTouchDownXY[1] = event.getY();
            }

            // let the touch event pass on to whoever needs it
            return false;
        }
    };

    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // retrieve the stored coordinates
            float x = lastTouchDownXY[0];
            float y = lastTouchDownXY[1];

            // use the coordinates for whatever
            Log.i("TAG", "onLongClick: x = " + x + ", y = " + y);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

摘要

  • 添加一个类变量来存储坐标
  • 使用一个保存X,Y坐标 OnTouchListener
  • 访问中的X,Y坐标 OnClickListener

  • 可以使用 Point() 代替 2 个空格的浮点数组。 (2认同)

Tom*_*m R 3

覆盖 onTouchEvent(MotionEvent ev)

然后你可以这样做:

ev.getXLocation()
Run Code Online (Sandbox Code Playgroud)

或类似的东西。有一个布奇。

  • 您所要做的就是记录最后一个 ACTION_UP 或 ACTION_MOVE 事件的 x 和 y 位置,并在 OnClickListener 中使用这些值。 (21认同)
  • 嗨,汤姆,是的,我们可以使用 onTouchEvent,但是我们需要自己处理点击和长按的区别,不是吗?他们不会为您提供一种方法来了解 OnClickListener 等中单击或长按发生的位置,这是没有意义的?谢谢 (2认同)