如何使用View.OnTouchListener代替的onClick(How to use View

2019-06-17 13:33发布

我正在开发一个客户端在Android 2.2.2的申请,他要做到以下几点:

现在我有一个onClick事件的按钮,但他不喜欢,他想dectect当用户释放按钮。

我发现View.OnTouchListener我认为这就是我需要使用,但是,没有任何posibility添加此事件为xml就像我的onClick做?

<ImageButton
    android:id="@+id/btnSaveNewGate"
    android:layout_width="@dimen/btnSaveNewGate_width"
    android:layout_height="@dimen/btnSaveNewGate_height"
    android:layout_below="@+id/radioGrGateType"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="@dimen/btnSaveNewGate_marginTop"
    android:background="@null"
    android:contentDescription="@string/layout_empty"
    android:onClick="onSaveNewGateClick"
    android:scaleType="fitXY"
    android:src="@drawable/save_gate_selector" />

我有两个问题更多:

这是相关联的事件,当用户释放他的手指?

是否有禁止任何指引使用View.OnTouchListener代替onClick

Answer 1:

当用户释放他的手指的事件是MotionEvent.ACTION_UP 。 我不知道是否有使用View.OnTouchListener代替的onClick(),禁止任何指引,很可能它取决于形势。

下面是一个示例代码:

imageButton.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP){

            // Do what you want
            return true;
        }
        return false;
    }
});


Answer 2:

据推测,如果想使用OnTouchListener而非OnClickListener ,那么的额外功能OnTouchListener是必要的。 这是一个补充的答案,显示的是如何更详细OnTouchListener可以使用。

定义监听器

将这个地方你的活动或片段。

private View.OnTouchListener handleTouch = new View.OnTouchListener() {

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

        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("TAG", "touched down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i("TAG", "moving: (" + x + ", " + y + ")");
                break;
            case MotionEvent.ACTION_UP:
                Log.i("TAG", "touched up");
                break;
        }

        return true;
    }
};

设置监听器

设置在收听者onCreate (一个活动)或onCreateView (为一个片段)。

myView.setOnTouchListener(handleTouch);

笔记

  • getXgetY给你的坐标相对于视图(即视图的左上角)。 以上或您的视图的左侧移动时,它们将是负面的。 使用getRawXgetRawY如果你想绝对的屏幕坐标。
  • 您可以使用xy值来确定的事情,例如滑动方向。


Answer 3:

当用户释放按钮的OnClick被触发。 但是,如果你仍然想使用TouchListener你需要将其添加到代码。 只是:

myView.setOnTouchListener(new View.OnTouchListener()
{
    // Implementation;
});


文章来源: How to use View.OnTouchListener instead of onClick