2012-03-31 17 views
14

Estoy escuchando los eventos largos de clic de una Vista a través de setOnLongClickListener(). ¿Puedo cambiar la demora/duración del clic prolongado?Cambiar demora larga de clic

Respuesta

13

AFAIK, no. Está cableado en el marco a través del getLongPressTimeout() en ViewConfiguration.

Le invitamos a manejar sus propios eventos táctiles y definir su propio concepto de "clic largo". Solo asegúrese de que no sea muy diferente de lo que espera el usuario, y lo más probable es que el usuario espere lo que todas las demás aplicaciones usan, que es la duración estándar de 500 ms.

+2

¿Cómo definirías tu propio concepto de clic largo? – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+0

Gracias, supongo que me quedaré con el valor predeterminado por ahora. – fhucho

+0

@zzzzzzzzzzzzzzzzzzzzzzzzzz probablemente anulando la Vista. Cool nombre de usuario BTW ;-) – fhucho

3

Esta fue la solución de trabajo más sencilla que encontré para esta restricción:

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

Ésta es mi manera durante el tiempo establecido para pulsación larga

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

Esto es lo que yo uso. Es similar a la respuesta de Cumulo Nimbus, con dos diferencias notables.

  1. Utilice los valores de eventos ya almacenados para el tiempo de inactividad y la hora actual. Además de no duplicar esfuerzos, esto tiene el bonito efecto de hacer que el oyente se pueda utilizar para múltiples vistas al mismo tiempo sin tener que rastrear los tiempos de inicio de cada evento individual.
  2. Compruebe view.isPressed para asegurarse de que el usuario no se haya alejado de la vista durante el evento táctil. Esto imita el comportamiento predeterminado del sistema para onClick y 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; 
} 

Si la vista no es normalmente puede hacer clic usted tendrá que llamar a view.setClickable(true) para la view.isPressed() cheque para trabajar.