Подтвердить что ты не робот

Как определить длительное касание на Android?

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

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

Он будет похож на приложение Android для Google 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

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

4b9b3361

Ответ 1

Вот как вы обычно создаете 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)

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

Ответ 2

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

OnLongClickListener

Ответ 3

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

Ответ 4

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

Ответ 5

Вы можете настроить longClickListener и touchListener. Добавьте переменную члена данных типа boolean class 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 Maps. Надеюсь, что это поможет.