如何在按下按钮时继续添加?

How to keep adding while button is pressed?

我正在构建一个简单的计数器,它有用于从总值中添加或减去的按钮,我希望它在我按住按钮时继续添加,每秒递增 +5,但我遇到了问题让它起作用。我正在使用 onClickListener,但我无法找到使其与触摸侦听器一起工作的方法"together"。

pl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {  
                lf++;            
                lt.setText(Integer.toString(lf));                
            }
        }

您将不得不使用处理程序来安排每 1 秒递增 +5 的可运行对象(每 200 毫秒递增 1 以保持平稳)

Handler handler = new Handler();
Runnable incrementTask = new Runnable(){
     @Override
     public void run(){
           lf++;
           handler.postDelayed(incrementTask, 200); //Execute after 200 milliseconds
      }
};

然后在调度 ACTION_DOWN 时实现 onTouchListener 和 post 这个可运行对象,并在调度 ACTION_UP 时取消它。

boolean buttonPressed = false;
pl.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View arg0, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN){

                 //This check is imporant since ACTION_DOWN might be called 
                 // multiple times when finger is moving
                  if(!buttonPressed){
                        buttonPressed = true;
                        handler.post(incrementTask);            
                   }
            } else if(event.getAction() == MotionEvent.ACTION_UP){
                  if(buttonPressed)
                   {
                      buttonPressed = false;
                      handler.cancel(incrementTask);
                   }
            }
            return false;
        }
    });

请注意,此逻辑不适用于您当前的点击侦听器。为了更好的用户体验,我建议您仅在 长按 按钮时才启动此 timer/runnable。我在一个项目中遇到过类似的情况,所以我写了一个实用程序 class 来帮助我检测何时按住按钮并在长按后释放按钮。正常点击也能正常工作。你可以找到我的 ClickAndHoldManager class on Github.

要使用它,您只需在构造函数中传递您的视图并设置一个侦听器:

ClickAndHoldManager manager = new ClickAndHoldManager(myButton);
manager.setClickCallback(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             //Regular Click
            }
        });
manager.setHoldCallback(new ClickAndHoldManager.HoldListener() {
            @Override
            public void holdStarted() {
                // do handler.post() here
            }

            @Override
            public void holdEnded() {
                //do handler.cancel() here

            }
        });