簡體   English   中英

如何使用View.OnTouchListener代替onClick

[英]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);

筆記

  • getXgetY為您提供相對於視圖的坐標(即視圖的左上角)。 在視圖上方或左側移動時,它們將為負。 如果需要屏幕的絕對坐標,請使用getRawXgetRawY
  • 您可以使用xy值確定諸如滑動方向之類​​的內容。

用戶釋放按鈕時觸發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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM