【问题标题】:Button pressed once and button holds increments value(continuously)按钮按下一次,按钮保持增量值(连续)
【发布时间】:2023-03-15 02:05:02
【问题描述】:

我正在制作一个按钮,当按一次按住按钮时会增加值。只要按住按钮,该值就会不断增加。我被告知要使用 onTouch 而不是 onClick 来执行此操作,但找不到正确的方法。下面的代码只能按一次。谢谢。

public class MainActivity extends AppCompatActivity {
int i = 0;
TextView textView;
Button button;


@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button=findViewById(R.id.button);
    textView=findViewById(R.id.textView);

    button.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_UP){
                setText();
            }
            return true;
        }
        });

}//oncreate
public void setText(){
    textView.setText(""+i);
    i++;
}
}//class

【问题讨论】:

  • 您要禁用长按按钮吗?
  • 没有。我想实现这两个选项。它们可以通过单击或长按按钮来增加(更快地增加)
  • 好的看看this
  • @HemantParmar 谢谢,这确实很有吸引力。
  • 欢迎!很乐意为您提供帮助!

标签: android button onclick ontouch


【解决方案1】:

结合 MotionEvent.ACTION_DOWN 和定时器是关键。您将在 touch down 时启动一个计时器,在 touch up 时取消,如下所示:

活动中:

//timer for increment
Timer fixedTimer = new Timer();

void initTimer() {
    fixedTimer = new Timer();

}

注册定时器时:

btn.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN)
            {
                fixedTimer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        //increment here
                    }
                }, DELAY,INTERVAL_PERIOD_FOR_INCREMENT);
            }
            else if (event.getAction() == MotionEvent.ACTION_UP)
            {
                //cancel timer
                fixedTimer.cancel();
            }

            return false;
        }
    });

【讨论】:

    【解决方案2】:

    您需要使用 MotionEvent.ACTION_DOWN 使用下面的代码来获得正确的结果。

     button.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
    
            if (event.getAction() == MotionEvent.ACTION_DOWN){
                setText();
            }
            return true;
        }
        });
    

    现在,当您按住按钮时,它会增加值,而在操作时它什么也不做。

    希望这会有所帮助。

    【讨论】:

    • 这是单次增量还是连续增量(只要我按下按钮)
    • 是的,你想要一键连续递增吗?
    【解决方案3】:

    将 MotionEvent.ACTION_UP 替换为

    MotionEvent.ACTION_DOWN

    按下按钮

    mButton.setOnTouchListener(new OnTouchListener()
            {
    
                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    if (event.getAction() == MotionEvent.ACTION_DOWN)
                        Log.d("Pressed", "Button pressed");
                    else if (event.getAction() == MotionEvent.ACTION_UP)
    
                     Log.d("Released", "Button released");
                    // TODO Auto-generated method stub
                    return false;
                }
            });
    

    【讨论】:

      【解决方案4】:

      试试这个代码:

      final CountDownTimer countDownTimer=new CountDownTimer(Long.MAX_VALUE,1000) {
                  @Override
                  public void onTick(long l) {
                      int i= Integer.parseInt(finalTxtView.getText().toString());
                      finalTxtView.setText(String.valueOf(++i));
                  }
      
                  @Override
                  public void onFinish() {
      
                  }
              };
      
              btnPresMe.setOnTouchListener(new View.OnTouchListener() {
                  @Override
                  public boolean onTouch(View view, MotionEvent motionEvent) {
                      if (motionEvent.getAction()==MotionEvent.ACTION_DOWN)
                      {
                          countDownTimer.start();
                      }
                      if (motionEvent.getAction()==MotionEvent.ACTION_UP)
                      {
                          countDownTimer.cancel();
                      }
                      return false;
                  }
              });
      

      当你按住按钮时,它会在每 1 秒过去后增加值。您可以根据需要更改 1000(1 秒)。

      【讨论】:

        猜你喜欢
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 2010-09-28
        • 2018-07-27
        • 1970-01-01
        相关资源
        最近更新 更多