知道按钮处于按下状态的时间

问题描述 投票:1回答:2

[我希望当您在3秒钟内按住按钮时可以执行某些操作,我尝试使用上面的代码,但是仅当我在按住期间停止不按住时,它才会执行某些操作。我应该实现一个监听器或类似的东西吗?

finishPushing = true;
.
.
.    

button.setOnTouchListener(new OnTouchListener()
            {

                @Override
                public boolean onTouch(View v, MotionEvent event) {

                    if(android.os.SystemClock.elapsedRealtime() - event.getDownTime() > 3000 && (event.getPointerCount() == 1) && finishPushing)
                    {
                        // Do something                     

                        finishPushing = false;
                    }
                    else{
                        finishPushing = true;
                    }
                    return false;
                }

            });
android ontouchlistener
2个回答
3
投票

感谢Android Touch Event determining duration解决了

        button.setOnTouchListener(new OnTouchListener()
        {
            private final Handler handler = new Handler();
            private final Runnable runnable = new Runnable() {
                public void run() {
                     if(mBooleanIsPressed)
                     {
                         // do whatever
                     }
                }
            };


            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    // Execute your Runnable after 5000 milliseconds = 5 seconds.
//After this 5secs it will check if is pressed
                    handler.postDelayed(runnable, 5000);    
                    mBooleanIsPressed = true;               
                }

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

0
投票

此解决方案灵活且可重复使用,对我有很大帮助。

public class OnLongPressListener implements View.OnTouchListener {
private static Handler handler = new Handler();
private static final long WAIT_TIME_DELTA = 1000;
private static boolean isCanceled = false;
private static LongPressListener listener;
private static long startTime;

public OnLongPressListener(LongPressListener listener) {
    OnLongPressListener.listener = listener;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN) {
        startTime = System.currentTimeMillis();
        startTimer();
    }
    if(event.getAction() == MotionEvent.ACTION_UP) {
        //Make sure single press isn't called if it was long
        if(startTime > System.currentTimeMillis() - WAIT_TIME_DELTA) {
            isCanceled = true;
            listener.doOnSinglePress();
        }
    }
    return true;
}

private static void startTimer() {
    handler.postDelayed(runnable, WAIT_TIME_DELTA);
}

private static Runnable runnable = new Runnable() {
    @Override
    public void run() {
        if(!isCanceled) {
            listener.doOnLongPress();
        }
        isCanceled = false;
    }
};


public interface LongPressListener {
    void doOnLongPress();
    void doOnSinglePress();
}
}

您当然不必像我一样使用该界面,但这是为具有OnTouch方法的任何视图设置长按侦听器的最简单方法。

© www.soinside.com 2019 - 2024. All rights reserved.