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

时间:2019-07-26 21:52:02

标签: android counter

我正在构建一个简单的计数器,它具有用于增加或减少总值的按钮,如果我按住该按钮,则希望它继续增加,每秒增加+5,但是我在制作时遇到了问题工作。我正在使用onClickListener,但是我找不到找到使其与触摸式监听器“一起”工作的方法。

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

1 个答案:

答案 0 :(得分:-1)

您将不得不使用处理程序来安排一个可运行对象,该可运行对象每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
      }
};

然后,您实现onTouchListener并在调度ACTION_DOWN时发布此可运行对象,并在调度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;
        }
    });

请注意,此逻辑不适用于您当前的点击监听器。为了获得更好的用户体验,我建议您仅在长按按钮时才启动此计时器/可运行计时器。我在项目中也遇到过类似情况,因此我编写了一个实用程序类来帮助我检测长时间单击后何时按住和释放按钮。正常点击也可以正常工作。您可以在ClickAndHoldManager上找到我的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

            }
        });