Android 当您在按钮上移动时,如何检测触摸

Android 当您在按钮上移动时,如何检测触摸,android,Android,我已经在版面的中心创建了一个宽度为50dp的按钮。如果我触摸版面最左侧的屏幕(没有按钮),然后按住(一直按住),直到我到达中间的按钮,那么它应该会检测到触摸。我该如何做。我已经尝试了onCLicklistener()和onTouchListener()但我仍然无法察觉这种触摸。 基本上像手势,但我认为巴顿有办法检测到 button.setOnTouchListener(new OnTouchListener() { @Override public boole

我已经在版面的中心创建了一个宽度为50dp的按钮。如果我触摸版面最左侧的屏幕(没有按钮),然后按住(一直按住),直到我到达中间的按钮,那么它应该会检测到触摸。我该如何做。我已经尝试了onCLicklistener()和onTouchListener()但我仍然无法察觉这种触摸。 基本上像手势,但我认为巴顿有办法检测到

 button.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

// Toast text : entered within button


         return false;
        }
       }))

如果我们将Click或Touch listener设置为按钮,该按钮的中心宽度为50dp,那么只有当用户从按钮开始单击/触摸时,listener才会收到回调

在您遇到问题的情况下,您正在从外部启动单击/触摸并转到按钮

所以,按钮侦听器将不会从Android框架获得回调

为了满足您的需求,我们需要添加一些逻辑,我尝试在这里添加:

activity\u main.xml:

<RelativeLayout android:id="@+id/parentLayout" ... >

    <Button android:id="@+id/buttonCenter ... />

</RelativeLayout>


实际上,当您放置触摸MotionEvent.ACTION_DOWN事件时,将在您触摸的视图上调度,并且当您移动MotionEvent.ACTION_move事件时,将为移动的每个像素点调度,直到您释放viz。在同一视图上调度MotionEvent.ACTION\u UP事件之前,事件不会移交给任何其他视图


这就是为什么它不在按钮上检测,因为它实际上是其父视图的事件。因此,在父对象上编写一个ontouchlistener,并根据event.getRawX()和event.getRawY()的像素位置处理触摸。

buttonLeft我尝试了if(buttonLeft
if)(buttonLeft)如果((buttonLeft)由于某种原因,此逻辑不起作用,如果((buttonLeft)它可能是因为x=event.getx()和y=event.gety()不匹配。但是为什么?
// apply touch listener to parentLayout
button = (Button) findViewById(R.id.buttonCenter);
parent = (RelativeLayout) findViewById(R.id.parentLayout);

parent.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

        Log.d("tag","in onTouch...");
        checkTouch(event);

         return true;
        }
       });

// check if touch entered button area

// save button left, right, top and bottom edge

// update : This is API i found on google documentation
float[] params;
button.getLocationOnScreen(params);

public void checkTouch(MotionEvent event) {
    x = event.getX();
    y = event.getY();

    if(x >= param[0] && x <= (param[0]+button.getWidth())) {
        if(y >= param[1] && y <= (param[1]+button.getHeight())) {
            Log.d("tag","this touch is in button area");
            // do what you want to do when touch/click comes in button area
        }
    }
}