【问题标题】:How to keep adding while button is pressed?按下按钮时如何继续添加?
【发布时间】:2019-07-26 21:52:02
【问题描述】:

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

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

【问题讨论】:

    标签: android counter


    【解决方案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;
            }
        });
    

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

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

    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
    
                }
            });
    

    【讨论】:

    • 哥们,你的课会在很多方面帮助我,我不知道该怎么感谢你
    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 2014-03-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多