OnClickListener - 事件的x,y位置?

时间:2009-12-27 21:03:33

标签: android

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

看起来这样做,我需要覆盖onTouchEvent()。但是,无法从OnClickListener获取事件的x,y位置吗?

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

4 个答案:

答案 0 :(得分:81)

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

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

正是Mark所要求的......

答案 1 :(得分:18)

完整示例

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

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

摘要

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

答案 2 :(得分:2)

覆盖onTouchEvent(MotionEvent ev)

然后你可以这样做:

ev.getXLocation()

或类似的东西。有一个屁股。

答案 3 :(得分:0)

您可以在Kotlin中创建扩展功能,如下所示:

fun View.setOnClickListenerWithPoint(action: (Point) -> Unit) {
    val coordinates = Point()
    val screenPosition = IntArray(2)
    setOnTouchListener { v, event ->
        if (event.action == MotionEvent.ACTION_DOWN) {
            v.getLocationOnScreen(screenPosition)
            coordinates.set(event.x.toInt() + screenPosition[0], event.y.toInt() + screenPosition[1])
        }
        false
    }
    setOnClickListener {
        action.invoke(coordinates)
    }
}

如果需要长按-只需更换setOnClickListener

我使用getLocationOnScreen()是因为我需要RecyclerView的ViewHolder的坐标