如何使用View.OnTouchListener而不是onClick

Van*_*nel 41 android user-input android-layout

我正在为客户开发Android 2.2.2应用程序,他想要执行以下操作:

现在我有一个带有onClick事件的按钮,但他不喜欢,他想在用户释放按钮时检测.

我找到了View.OnTouchListener,我认为这是我需要使用的但是,有没有可能将这个事件添加到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" />
Run Code Online (Sandbox Code Playgroud)

我还有两个问题:

当用户松开手指时,哪个事件相关联?

有没有禁止使用的指导View.OnTouchListener代替onClick

And*_*Res 73

用户松开手指时的事件是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;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以在event.getAction()上使用开关,案例可以是MotionEvent.ACTION_UP,MotionEvent.ACTION_DOWN等等. (4认同)
  • 请注意,如果您在那里返回 false,则 if 子句将永远不会触发。参见:/sf/answers/1425192191/ (2认同)

Sur*_*gch 11

据推测,如果想要使用OnTouchListener而不是a 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

设置监听器

将侦听器设置为onCreate(对于"活动")或onCreateView(对于"片段").

myView.setOnTouchListener(handleTouch);
Run Code Online (Sandbox Code Playgroud)

笔记

  • getXgetY为您提供相对于视图的坐标(即视图的左上角).在视图的上方或左侧移动时,它们将为负数.使用getRawX,getRawY如果你想要绝对的屏幕坐标.
  • 您可以使用xy值来确定滑动方向等内容.


Cas*_*eyB 5

用户释放按钮时会触发OnClick.但是如果您仍想使用TouchListener,则需要在代码中添加它.只是:

myView.setOnTouchListener(new View.OnTouchListener()
{
    // Implementation;
});
Run Code Online (Sandbox Code Playgroud)