Как определить долгое касание на андроиде? - PullRequest
16 голосов
/ 29 июня 2011

Я ищу способ, когда пользователь долго касается отображения карты (скажем, в течение 1000 мс), чтобы я мог как-то выполнить определенное действие.

Как бы я мог судить о том, как долго пользователь дотрагивается до вида карты (или любого вида).

Это было бы похоже на приложение Google Maps для Android, когда вы долго нажимаете, оно вызываетэлемент наложения воздушного шара.

Изменить добавлено

mapView.setOnLongClickListener(new View.OnLongClickListener() {

        public boolean onLongClick(View v) {

            Toast.makeText(mapView.getContext(), "Hello 123", 2000);
            return false;
        }
    });

выше не работает ... есть идеи почему?

Редактировать добавлено

Этото, что я сейчас пытаюсь, но, похоже, не работает, даже если я только нажимаю на телефоне, оно говорит, что событие является action_move,

я использую внутренний класс в моей MapActivity

    private long startTime=0;
private long endTime=0;

class MapOverlay extends Overlay {



    @Override
    public boolean onTouchEvent(MotionEvent ev, MapView mapView) {

        if(ev.getAction() == MotionEvent.ACTION_DOWN){
             //record the start time
             startTime = ev.getEventTime();

             Log.d("LC", "IN DOWN");
          }else if(ev.getAction() == MotionEvent.ACTION_UP){
             //record the end time
             endTime = ev.getEventTime();
             Log.d("LC", "IN UP");
          }else if(ev.getAction() == MotionEvent.ACTION_MOVE){
              Log.d("LC", "IN move");
              endTime=0;
          }

          //verify
          if(endTime - startTime > 1000){
             //we have a 1000ms duration touch
             //propagate your own event
              Log.d("LC", "time touched greater than 1000ms");
              Toast.makeText(getBaseContext(), "Hello 123", Toast.LENGTH_SHORT).show();
              startTime=0; 
              endTime=0;
             return true; //notify that you handled this event (do not propagate)
          }

        return false;//propogate to enable drag

    }

}

и вот мой журнал ошибок, который не имеет никакого смысла для меня

06-29 14:29:55.509: DEBUG/LC(7693): IN move
06-29 14:29:56.149: DEBUG/LC(7693): IN UP
06-29 14:29:56.149: DEBUG/LC(7693): 6346707 6349261
06-29 14:29:56.149: DEBUG/LC(7693): time touched greater than 1000ms

время окончания должно быть установлено на ноль ... но это не ... любая идеяпочему?

Ответы [ 5 ]

8 голосов
/ 05 июня 2014

Так вы обычно создаете onLongClickListener. Попробуйте это:

mapView.setOnLongClickListener(new OnLongClickListener() {

        @Override
        public boolean onLongClick(View arg0) {

            Toast.makeText(mapView.getContext(), "Hello 123", 2000);

            return false;

        }
    });

Ссылка на ваше редактирование:

Это может быть способ получить то, что вы хотите.

private final Handler handler = new Handler();
private final Runnable runnable = new Runnable() {
public void run() {
     checkGlobalVariable();
}
};

// Other init stuff etc...

@Override
public void onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
    // Execute your Runnable after 1000 milliseconds = 1 second.
    handler.postDelayed(runnable, 1000);
    mBooleanIsPressed = true;
}

if(event.getAction() == MotionEvent.ACTION_UP) {
    if(mBooleanIsPressed) {
        mBooleanIsPressed = false;
        handler.removeCallbacks(runnable);
    }
}
}

А теперь вы можете проверить с помощью функции checkGlobalVariable:

if(mBooleanIsPressed == true)

Вот как вы можете справиться с этим делом. Удачи.

4 голосов
/ 29 июня 2011

Вы, вероятно, ищете нормальный длинный щелчок? Вам нужно будет настроить свой вид на длинные клики, добавив android: longClickable к своим представлениям xml или вызвав setLongClickable (true) Затем вы можете добавить OnLongClickListener к представлению. Я не знаю, как точно определить, как долго будет длиться длинный клик. Но длинный щелчок по умолчанию совпадает с длинным щелчком карты Google, который вы упомянули.

OnLongClickListener

2 голосов
/ 24 марта 2017

Вы можете настроить longClickListener и touchListener. Добавьте переменную-член данных логического класса longClicked и изначально установите для нее значение false. Вот как вы можете установить longClickListener.

    view.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            longClicked = true;
            return false;
        }
    });

Для TouchListener

    view.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(longClicked){
                //Do whatever you want here!!
                longClicked = false;
            }
            return false;
        }
    });

Это даст вам тот же эффект, что и карты Google при длинном щелчке. Надеюсь, это поможет.

1 голос
/ 17 мая 2013

используйте System.currentTimeMillis() вместо ev.getEventTime();

0 голосов
/ 05 июня 2014

Когда для MotionEvent.ACTION_UP, endTime будет установлено значение ev.getEventTime (), установка endTime в ноль будет выполнена, если MotionEvent.ACTION_MOVE не повлияет. Вместо установки endTime в ноль, вы должны установить startTime в ev.getEventTime ()

...