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

2

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

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

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

Ваш Ответ

4   ответа
0

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

1

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

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

Error: User Rate Limit Exceeded Tickled Pink
Error: User Rate Limit Exceeded Tickled Pink
Error: User Rate Limit Exceeded
1

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Tickled Pink
Error: User Rate Limit Exceeded Tickled Pink
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;
    }
    }
}
Error: User Rate Limit ExceededanswerError: User Rate Limit Exceeded

Похожие вопросы