Изменение задержки длинного клика

Я слушаю события View long click через setOnLongClickListener(). Могу ли я изменить длительность/продолжительность длительного клика?

Ответы

Ответ 1

AFAIK, no. Он жестко связан в рамках через getLongPressTimeout() на ViewConfiguration.

Вы можете обрабатывать свои собственные события касания и определять свою концепцию "длинного клика". Просто убедитесь, что он не слишком сильно отличается от того, что ожидает пользователь, и, скорее всего, пользователь будет ожидать того, что используют все остальные приложения, что является стандартной продолжительностью 500 мс.

Ответ 2

Это мой способ длительной установки длительности нажмите

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

Ответ 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;
      }
    });

Ответ 4

Это то, что я использую. Это похоже на ответ Кумуло Нимба, с двумя заметными отличиями.

  • Используйте значения уже сохраненных событий для времени простоя и текущего времени. Помимо дублирования усилий, это имеет приятный эффект, позволяя слушателю использовать несколько просмотров одновременно, не отслеживая время начала каждого отдельного события.
  • Проверьте view.isPressed, чтобы пользователь не отошел от просмотра во время события касания. Это имитирует поведение системы по умолчанию для onClick и 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;
}

Если просмотр не является обычно кликабельным, вам необходимо вызвать view.setClickable(true) для проверки view.isPressed().