我正在为一个客户开发一个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
?
用户松开手指时的事件为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;
}
});
假设,如果要使用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);
票据
getX
和getY
为您提供相对于视图(即视图的左上角)的坐标。当移动到视图上方或左侧时,它们将是负值。如果需要绝对屏幕坐标,请使用getRawX
和getRawY
- 您可以使用
x
和y
值来确定滑动方向等
OnClick在用户释放按钮时触发。但是,如果您仍然想使用TouchListener,则需要将其添加到代码中。只是:
myView.setOnTouchListener(new View.OnTouchListener()
{
// Implementation;
});
对于使用示例触摸监听器,您只需要此代码
@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;
}