如何使用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

Related of "如何使用View.OnTouchListener而不是onClick"

用户释放手指时的事件是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值来确定滑动方向。