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\n"; 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(); } } }
執行的結果:



