如何使用View.OnTouchListener而不是onClick

我正在为客户开发Android 2.2.2应用程序,他想要做以下事情:

现在我有一个onClick事件的button,但他不喜欢,他想要检测当用户释放button。

我发现View.OnTouchListener ,我认为这是我需要使用,但是,是否有任何posible将此事件添加到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

  • 在Ionic / Cordova应用程序上只显示数字键盘
  • 在Android中的BluetoothSocket inputstream.read()中实现超时
  • RemoteInput上的AllowedDataTypes是什么?
  • 如何检测用户在Android的存在?
  • 更改EditText的错误消息的背景
  • 如何检测Android上的触摸input
  • input在html中的maxlength属性在HTC One M7上不起作用
  • 通过Java编程语言在android中读取/ dev / input / event
  • 用户释放手指时的事件是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; } }); 

    OnClick在用户释放button时触发。 但是如果你仍然想使用TouchListener,你需要将它添加到代码中。 只是:

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

    据推测,如果想要使用OnTouchListener而不是OnClickListener ,那么需要使用OnTouchListener的额外function。 这是显示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给你相对于视图的坐标(也就是视图的左上angular)。 当你在视图的上方或左边移动时,它们将是负面的。 如果你想要绝对的屏幕坐标,使用getRawXgetRawY
    • 您可以使用xy值来确定滑动方向。