2012-03-31 150 views
14

我正在通過setOnLongClickListener()偵聽View的長按事件。我可以改變長時間點擊延遲/持續時間嗎?更改長點擊延遲

回答

13

AFAIK,no。它通過ViewConfiguration上的getLongPressTimeout()在框架中硬連接。

歡迎您處理您自己的觸摸事件並定義您自己的「長按」概念。只要確保它與用戶所期望的不會有太大的差異,並且用戶很可能會期待所有其他應用程序使用的內容,這是標準的500毫秒持續時間。

+2

你將如何去定義自己的長點擊概念? – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 2012-03-31 19:34:17

+0

謝謝,我想我現在會堅持默認。 – fhucho 2012-03-31 19:58:13

+0

@zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz可能通過重寫View。酷的用戶名順便說一句;-) – fhucho 2012-03-31 19:59:44

3

這是最簡單有效的解決方案,我發現這個限制:

//Define these variables at the beginning of your Activity or Fragment: 
private long then; 
private int longClickDuration = 5000; //for long click to trigger after 5 seconds 

... 

//This can be a Button, TextView, LinearLayout, etc. if desired 
ImageView imageView = (ImageView) findViewById(R.id.desired_longclick_view); 
imageView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      then = (long) System.currentTimeMillis(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      if ((System.currentTimeMillis() - then) > longClickDuration) { 
      /* Implement long click behavior here */ 
      System.out.println("Long Click has happened!"); 
      return false; 
      } else { 
      /* Implement short click behavior here or do nothing */ 
      System.out.println("Short Click has happened..."); 
      return false; 
      } 
     } 
     return true; 
     } 
    }); 
11

這是我設定的時間段的方式來長按

private int longClickDuration = 3000; 
private boolean isLongPress = false; 

numEquipeCheat.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       isLongPress = true; 
       Handler handler = new Handler(); 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         if (isLongPress) { 
          Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE); 
          vibrator.vibrate(100); 
          // set your code here 
          // Don't forgot to add <uses-permission android:name="android.permission.VIBRATE" /> to vibrate. 
         } 
        } 
       }, longClickDuration); 
      } else if (event.getAction() == MotionEvent.ACTION_UP) { 
       isLongPress = false; 
      } 
      return true; 
     } 
    }); 
2

這是我使用。這與Cumulo Nimbus的答案類似,有兩個顯着差異。

  1. 對於停機時間和當前時間使用已存儲的事件值。除了不重複工作之外,這樣做的好處是可以使偵聽器可以同時用於多個視圖,而無需跟蹤每個單獨事件的開始時間。
  2. 檢查view.isPressed以確保用戶在觸摸事件期間沒有離開視圖。這模仿onClickonLongClick的默認系統行爲。

long longPressTimeout = 2000; 

@Override 
public boolean onTouch(View view, MotionEvent event) { 
    if (view.isPressed() && event.getAction() == MotionEvent.ACTION_UP) { 
     long eventDuration = event.getEventTime() - event.getDownTime(); 
     if (eventDuration > longPressTimeout) { 
      onLongClick(view); 
     } else { 
      onClick(view); 
     } 
    } 
    return false; 
} 

如果視圖通常不會點擊你需要調用view.setClickable(true)view.isPressed()檢查工作。