2012-03-31 14 views

Odpowiedz

13

AFAIK, nie. Jest podłączony przewodowo w ramach przez getLongPressTimeout() na ViewConfiguration.

Zapraszamy do obsługi własnych wydarzeń dotykowych i zdefiniowania własnej koncepcji "długiego kliknięcia". Po prostu upewnij się, że nie różni się on znacząco od tego, czego oczekuje użytkownik, i najprawdopodobniej użytkownik będzie oczekiwał tego, co używają wszystkie inne aplikacje, co jest standardowym czasem trwania 500 ms.

+2

Jak zdefiniowałbyś swoją własną koncepcję długiego kliknięcia? – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+0

Dzięki, domyślam się, że na razie pozostanę domyślny. – fhucho

+0

@zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz prawdopodobnie przez przesłonięcie widoku. Fajna nazwa użytkownika BTW ;-) – fhucho

3

To było najprostsze rozwiązanie roboczego znalazłem do tego ograniczenia:

//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

To jest mój sposób na zadany czas na długi prasy

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

To właśnie używam. Jest podobny do odpowiedzi Cumulo Nimbus, z dwiema znaczącymi różnicami.

  1. Użyj już zapisanych wartości zdarzeń dla czasu przestoju i bieżącego czasu. Oprócz powielania wysiłków, ma to dobry wpływ na to, aby słuchacz był użyteczny dla wielu widoków jednocześnie, bez śledzenia czasów rozpoczęcia dla każdego pojedynczego zdarzenia.
  2. Sprawdź, czy użytkownik view.isPressed nie odsunął się od widoku podczas zdarzenia dotyku. To naśladuje domyślne zachowanie systemu dla onClick i onLongClick.

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; 
} 

Jeśli widok nie jest normalnie klikalne będzie trzeba zadzwonić view.setClickable(true) do kontroli view.isPressed() do pracy.