【问题标题】:How to get the time a button is pressed while user still holding down in android如何在用户仍然按住android时获取按下按钮的时间
【发布时间】:2016-12-12 21:27:08
【问题描述】:

所以我试图在按钮上显示用户开始按下它的时间,这是我的代码:

btn.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            long eventDuration;

            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    isDown = true;
                    break;
                case MotionEvent.ACTION_UP:
                    isDown = false;
                    break;
                default:
                    break;
            }
            eventDuration = motionEvent.getEventTime() - motionEvent.getDownTime();
            btn.setText(String.valueOf(eventDuration));
            return true;

        }

    });

如果用户按住按钮并且不移动手指,则代码正在工作,但按下时间的值不会更新,因为没有诸如“MotionEvent.ACTION_HOLD”之类的动作。即使用户没有移动手指,我也希望该值不断更新。

我尝试在每次 Action 为“MotionEvent.ACTION_DOWN”时运行一个方法

while(isDown){
    eventDuration = motionEvent.getEventTime() - motionEvent.getDownTime();
                    btn.setText(String.valueOf(eventDuration));
    }

但是没有工作,while 循环没有停止,isDown 保持了它的最后一个值true。谁能告诉我如何让它工作?谢谢!

【问题讨论】:

    标签: android listener android-button ontouchlistener motionevent


    【解决方案1】:

    您可以在此处使用 CountDownTimer,当用户按下按钮时启动具有非常高值的最大限制的 countDownTimer,并在您在 ouTouchListener 中收到 action_up 时取消它

    int TICK_DURATION = 1000;
    int MAX_LIMIT_IN_MILLISECONDS = Integer.MAX_VALUE;
    CountDownTimer cdt = new CountDownTimer(MAX_LIMIT_IN_MILLISECONDS, TICK_DURATION) {
    
        public void onTick(long millisUntilFinished) {
            mTextField.setText("seconds spent: " + (MAX_LIMIT_IN_MILLISECONDS-millisUntilFinished) / 1000);
           //here you can have your logic to set text to edittext
        }
    
        public void onFinish() {
            // this will be called when max int value is reached!! depending upon your requirement you can restart countdownTimer here
        }
    
    }
    

    然后在里面启动这个 Action_down 还没有启动,否则重置它

    cdt.start();
    

    并在 action_down 中完成它

    cdt.cancel();
    

    【讨论】:

    • 使用 countDownTimer 的好主意。我试试谢谢!
    【解决方案2】:

    你需要使用定时器

    private int timeDown;
    private TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            //update
        }
    };
    private Timer timer;
    

    然后在你的 onTouch 事件中,启动 Timer

    btn.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
    
            long eventDuration;
    
            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    isDown = true;
                    if(timer == null){
                       timer = new Timer();
                       int updateFrequency = 1000; // every second
                       timeDown = motionEvent.getDownTime();
                       timer.scheduleAtFixedRate(timerTask, 0, updateFrequency);
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    isDown = false;
                    timer.cancel();
                    timer = null;
                    break;
                default:
                    break;
            }
            return true;
    
        }
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2013-06-07
      • 2015-06-25
      • 2012-07-27
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多