[英]How to use View.OnTouchListener instead of onClick
我正在為客戶開發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
(對於Activity)或onCreateView
(對於Fragment)中設置偵聽器。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.