如何在按钮上移动时检测触摸

时间:2015-03-20 04:12:56

标签: android

我在布局的中心创建了一个宽度为50dp的按钮。如果我触摸布局左侧的屏幕(没有按钮的位置)并按住(按住)直到我到达按钮然后它应该检测触摸。我怎么能这样做。我已经尝试了onCLicklistener()和onTouchListener(),但我仍然无法检测到触摸。 基本上像手势,但我认为按钮有一种检测方式。

 button.setOnTouchListener(new OnTouchListener() {

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

// Toast text : entered within button


         return false;
        }
       }))

2 个答案:

答案 0 :(得分:1)

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

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

因此,按钮侦听器不会从Android Framework获得回调

为了您的工作需求,我们需要添加一些逻辑,我试图在这里添加它:

activity_main.xml:

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

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

</RelativeLayout>

MainActivity.java:

// 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
        }
    }
}

答案 1 :(得分:0)

实际上当您触摸时,MotionEvent.ACTION_DOWN事件将在您触摸的视图上调度,并且当您移动时,MotionEvent.ACTION_MOVE事件将针对移动的每个像素点进行调度,直到您释放viz。直到在同一视图上调度MotionEvent.ACTION_UP事件时,事件才会被移交给任何其他视图。

这就是为什么它没有检测到按钮,因为它实际上是其父视图的事件。因此,在父项上写一个ontouchlistener,然后在句柄中根据event.getRawX()&amp; event.getRawY()以像素为单位。