安卓:如何长按手动实现在触摸事件?(Android : How to implement longp

2019-07-28 20:26发布

短版:我想一个方式开始上的onTouchEvent基于时间的计数器,并且测试一下时间一定量的响应之前已过,作为手动LongTouch检测。

说明:我有一个在/上两指甩了屏幕滑动的自定义ImageView的。 我想拖动事件添加到它,但这些都需要比一个长按快。 我可以用一个计数器,每更新的onTouchEvent一次且仅触发,比如说,10个计数拖延迟拖动事件,但计数器只对触摸事件的更新和手指必须移动。

如何创建一个基于时间的计数器,这是增加的活性水平场60次的速率或诸如此类?

Answer 1:

我不知道从你的问题,但似乎你想在你的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;
    }
    }
}


Answer 2:

只要看看android系统的源代码。

长按GestureDetector开始对“键按下”延迟的消息。 当这个消息被“键向上”来之前它是一个长按。

到源只是一个链接http://www.devdaily.com/java/jwarehouse/android/core/java/android/view/GestureDetector.java.shtml



Answer 3:

我会接近这个问题的方法是,当发生ACTION_DOWN一些布尔值设置为true。 如果action_up出现则布尔值设置为false。 也开始postDelayed集时ACTION_DOWN时要什么延迟。 在postdelayed,如果您之前设置为true的布尔仍然是正确的,然后做你想做的。 对不起,这样罗嗦的答案,但是这是我会怎么做。



Answer 4:

答:使用系统时钟(elapsedRealtime()),测量毫秒,因为媒体已启动。 容易,一旦你开始得到了它的窍门。



文章来源: Android : How to implement longpress manually in touch event?