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

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

  1、首先,设置标识变量

 private boolean booleanConnect = false;
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();
}
} }

  执行的结果:

  

Android 按钮长按下去重复执行某个动作,放开后停止执行动作的更多相关文章

  1. 使用定时器实现JavaScript的延期执行或重复执行

    使用定时器实现JavaScript的延期执行或重复执行 window 对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和 window.setInterval.其中前 ...

  2. 【Android 应用开发】Android - 按钮组件详解

    总结了Android中常用的按钮用法 示例源码下载地址 : -- CSDN :  http://download.csdn.net/detail/han1202012/6852091 -- GitHu ...

  3. Android - 按钮组件详解

    总结了Android中常用的按钮用法 示例源码下载地址 : -- CSDN :  http://download.csdn.net/detail/han1202012/6852091 -- GitHu ...

  4. JQuery脚本-通过禁用按钮防止表单重复提交

    <script type="text/javascript"> /* jquer 脚本,避免重复提交 隐藏点击的submit,后在他之后插入同名button伪装成被隐藏 ...

  5. Celery异步任务重复执行(Redis as broker)

    之前讲到利用celery异步处理一些耗时或者耗资源的任务,但是近来分析数据的时候发现一个奇怪的现象,即是某些数据重复了,自然想到是异步任务重复执行了. 查阅之后发现,到如果一个任务太耗时,任务完成时间 ...

  6. 【JavaScript】使用定时器实现Js的延期执行或重复执行setTimeout,setInterval

    使用定时器实现JavaScript的延期执行或重复执行 window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval.其中前者可 ...

  7. remove name="ProxyModule“会导致重复执行

    <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访 ...

  8. jquery 实现重复点击一个元素时不重复执行效果

    jquery 实现重复点击一个元素时不重复执行效果 这需要用到jquery的stop方法 实例 停止当前正在运行的动画: $("#stop").click(function(){ ...

  9. Spring的quartz定时器同一时刻重复执行二次的问题解决

    最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候, ...

随机推荐

  1. 【Python学习】csv库

    csv(Comma-Separated Values, 逗号分割值)是存储表格数据的常用文件格式. 它每一行都用一个换行符分隔,列与列之间用逗号分隔. 本地文件 Python的csv库可以非常简单地修 ...

  2. Linux用户密码期限修改

    今天有开发报故,sftp无法登录.检查服务都是正常的,之前3月份也出现过此问题,当时忙没有注意,现在看每3个月出现问题.这才想到是密码过期导致的. 先重置用户密码,发现过期日志为Oct 08, 201 ...

  3. php 学习try_catch测试抛出异常

    /** * Class show * 一个catch接收抛出异常 */ class show { // 错误的演示 //try { //require ('test_try_catch.php'); ...

  4. .pnts点云

    一种3d tiles格式 MIME格式: <configuration> <system.webServer> <staticContent> <remove ...

  5. cfg 4 ocl

    http://blog.sina.com.cn/s/blog_6c868c470102v15y.html rnnlib真难装 http://sourceforge.net/p/rnnl/wiki/Ho ...

  6. “裕同集团&易普优APS项目启动大会”顺利召开

    “裕同集团&易普优APS项目启动大会”顺利召开 ——易普优APS助力裕同集团实现精益生产 2017年7月05日,“裕同集团&易普优APS项目启动大会”顺利召开,裕同集团高级王副总裁.I ...

  7. Selenium--testNG下载地址

    TestNG - http://beust.com/eclipse   http://testng.org/doc/eclipse.html http://testng.org/doc/seleniu ...

  8. 不通过注册表使用ActiveX对象

    为了弄清楚COM库的运行原理,特意做了这个实验: #include "stdafx.h" #include "objbase.h" #include " ...

  9. DDL DML DCL DQL的区别

    原文章出处:http://blog.csdn.net/tomatofly/article/details/5949070 SQL(Structure Query Language)语言是数据库的核心语 ...

  10. Python并发编程-协程

    利用Greenlet模块在多线程之间切换 from greenlet import greenlet def eat(): print('eating start') g2.switch() prin ...