51

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

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

我找到了 View.OnTouchListener,我认为这是我需要使用的,但是,是否有可能像我对 onClick 所做的那样将此事件添加到 xml?

<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

4

4 回答 4

89

用户松开手指的事件是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;
    }
});
于 2012-07-27T15:12:21.000 回答
16

据推测,如果一个人想使用 anOnTouchListener而不是 an OnClickListener,那么需要额外的功能OnTouchListener。这是一个补充答案,以显示如何使用 an 的更多细节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(对于 Activity)或onCreateView(对于 Fragment)。

myView.setOnTouchListener(handleTouch);

笔记

  • getXgetY为您提供相对于视图的坐标(即视图的左上角)。当移动到您的视图上方或左侧时,它们将是负面的。如果您想要绝对屏幕坐标,请使用getRawXand 。getRawY
  • 您可以使用xy值来确定滑动方向等内容。
于 2016-09-20T07:59:39.133 回答
6

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

myView.setOnTouchListener(new View.OnTouchListener()
{
    // Implementation;
});
于 2012-07-27T15:07:00.730 回答
0

对于使用示例触摸监听器,您只需要此代码

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {

    ClipData data = ClipData.newPlainText("", "");
    View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
    view.startDrag(data, shadowBuilder, null, 0);

    return true;
}
于 2019-10-01T15:12:47.063 回答