Android 按钮长按下去重复执行某个动作,放开后停止执行动作

  Android开发中,常遇到一种需求,即按钮长按下去重复执行某个动作,放开后停止执行动作。网上找了许多代码,都没有适合的,于是自己动手写了一个。

  基本思路是:首先设置一个标识变量,用于标识是否处于按下的状态。当按钮按下的时候,将标识变量设置为true,启动一个线程用于重复执行某个动作(当标识变量为true时,循环执行动作,当为false跳出循环,结束动作);当按钮弹起来的时候,将标识变量设置为false。

  1、首先,设置标识变量

1 private boolean booleanConnect = false;
2 private Button rightSend;

  2、然后,初始化变量

protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         rightSend = (Button)findViewById(R.id.BtnRight);
 
         longPress = false;

         rightSend.setOnTouchListener(new View.OnTouchListener() {

                              @Override
                              public boolean onTouch(View v, MotionEvent event) {
                                      String str = "OND
";
                                      String strSendData = new String(str);
                                      LongTouchSendCmd(MainActivity.this, strSendData, event);
                                      return true;
                              }
                          }
                     );
}

  2、接着,实现按钮按下的重复执行动作  

 private void LongTouchSendCmd(final Activity activity, final String cmd, MotionEvent event){
        if (booleanConnect == false) {
            Toast.makeText(activity, "请先连接设备", Toast.LENGTH_SHORT).show();
            return;
        }
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                longPress = true;
                Toast.makeText(activity, "开始发送", Toast.LENGTH_SHORT).show();
                longPressSendCmdThread = new Thread() {
                    public void run() {
                        super.run();
                        while (true) {
                            if (longPress == true)//长按连续发送命令
                            {
                                try {
                       //todo some action 在这里添加代码,执行某个动作 //String strSendData
= cmd; //connectedThread.write(strSendData.getBytes());//接收数据 Thread.sleep(1000);//1秒发送一次 } catch (InterruptedException e) { e.printStackTrace(); } }else { break;//没有按下,退出循环 } } } }; longPressSendCmdThread.start(); break; } case MotionEvent.ACTION_UP:{ longPress = false; Toast.makeText(activity, "结束发送", Toast.LENGTH_SHORT).show(); } } }

  执行的结果:

  

原文地址:https://www.cnblogs.com/cv-pr/p/4764879.html