2

Вопрос по android – Android: Как реализовать longpress вручную в сенсорном событии?

Короткая версия: я хочу запустить счетчик времени на onTouchEvent и проверить, прошло ли определенное количество времени до ответа, как обнаружение LongTouch вручную.

Объяснение: У меня есть собственный imageView, который скользит в / из экрана на двухпалых бросках. Я хочу добавить к нему события перетаскивания, но они должны быть быстрее, чем длительное нажатие. Я могу отложить событие перетаскивания, используя счетчик, который обновляется один раз на onTouchEvent и запускает только перетаскивание, скажем, на 10 отсчетов, но счетчик обновляется только при событиях касания, и палец должен двигаться.

Как я могу создать счетчик, основанный на времени, поле уровня активности, которое увеличивается в 60 раз в секунду или несколько раз?

  • Error: User Rate Limit ExceededanswerError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Tickled Pink
  • Error: User Rate Limit Exceeded

    от Tickled Pink
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Tickled Pink
  • Error: User Rate Limit Exceeded

    от Tickled Pink
  • 0

    Ответ. Используйте системные часы (elapsedRealtime ()) и измеряйте мил

    лисекунды с момента начала печати. Легко, как только вы начнете понимать это.

  • 1

    Я бы подошел к этому

    установив для некоторого логического значения значение true, когда происходит действие Action_Down. Если происходит action_up, тогда установите логическое значение в false. Также запустите postDelayed для любой задержки, которую вы хотите, когда происходит action_down. В пост-задержке, если логическое значение, которое вы ранее установили в true, все еще равно true, тогда делайте, что хотите. Извините за такой многословный ответ, но я бы так и сделал.

  • 1

    Просто посмотрите в исходный код Android.

    Длительное нажатие в GestureDetector запускает отложенное сообщение по нажатию клавиши «вниз». Когда это сообщение приходит раньше, нажмите клавишу «вверх» это долгое нажатие.

    Просто ссылка на источник http://www.devdaily.com/java/jwarehouse/android/core/java/android/view/GestureDetector.java.shtml

  • 8

    Я не уверен в вашем вопросе

    но кажется, что вы пытаетесь реализовать событие click catch long в вашем onTouchListener, за исключением того, что вам нужно выполнить какую-то логику до того, как произойдет событие ACTION_UP? Если так, то это та же самая проблема, с которой я столкнулся. Я также пытался использовать System.nanoTime (), но я нашел менее хитрый метод. Вы МОЖЕТЕ использовать таймер, вам просто нужно запланировать его на первое событие ACTION_DOWN и отменить его, когда произойдет что-либо неблагоприятное (например, ACTION_UP, что означает, что он не был долгим нажатием, а всего лишь щелчком, или ACTION_MOVE со смещением более определенный порог). Что-то вроде следующего:

    layout.seyOnTouchListener(new OnTouchListener(){
        private Timer longpressTimer; //won't depend on a motion event to fire
        private final int longpressTimeDownBegin = 500; //0.5 s
        private Point previousPoint;
    
        switch(event.getAction()){
    
        case MotionEvent.ACTION_DOWN:{
            longPressTimer = new Timer();
            longpressTimer.schedule(new TimerTask(){
                //whatever happens on a longpress
            }, longpressTimeDownBegin);
            return true; //the parent was also handling long clicks
        }
        case MotionEvent.ACTION_MOVE:{
            Point currentPoint = new Point((int)event.getX(), (int)event.getY());
    
            if(previousPoint == null){
                previousPoint = currentPoint;
            }
            int dx = Math.abs(currentPoint.x - previousPoint.x);
            int dy = Math.abs(currentPoint.y - previousPoint.y);
            int s = (int) Math.sqrt(dx*dx + dy*dy);
            boolean isActuallyMoving = s >= minDisToMove; //we're moving
    
            if(isActuallyMoving){ //only restart timer over if we're actually moving (threshold needed because everyone's finger shakes a little)
                cancelLongPress();
                return false; //didn't trigger long press (will be treated as scroll)
            }
            else{ //finger shaking a little, so continue to wait for possible long press
                return true; //still waiting for potential long press
            }
        }
        default:{
            cancelLongPress();
            return false;
        }
        }
    }