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\n";
                                      String strSendData = new String(str);
                                      LongTouchSendCmd(MainActivity.this, strSendData, event);
                                      sendData.setText("");
                                  return false;
                              }
                          }
                     );
}

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

    }

  执行的结果:

  

时间: 2024-12-24 12:37:17

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

集群环境下如何防止定时任务重复执行?

起因 最近做项目是遇到这样一个问题:系统需要在每天的16:00向一些符合特定条件的用户发送一份邮件,发送成功后修改掉数据库中对应数据的标志位.本来是没有问题的,但后来系统被部署到了集群环境下,导致每天会向这些用户发送多次同样的数据,遭到了客户的抱怨. 解决 下面来介绍一下处理这种问题的解决办法: 1.在数据库中建立tm_job_group表 Name Type Comments group_id number 组id interval number 时间间隔区分定时任务的间隔即多长时间内不可重复

Laravel5.2队列驱动expire参数设置带来的重复执行问题 数据库驱动

  'connections' => [     ....         'database' => [             'driver' => 'database',             'table' => 'jobs',             'queue' => 'default',             'expire' => 60,         ],         'redis' => [             'driver

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

使用定时器实现JavaScript的延期执行或重复执行 window 对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和 window.setInterval.其中前者可以使一段代码在指定时间后运行:而后者则可以使一段代码 每过指定时间就运行一次.它们的原型如下: window.setTimeout(expression,milliseconds); window.setInterval(expression,milliseconds); 其中,expressi

屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能加载页面

发现在家里的时候用Android App里的WebView打开网站很慢,会有十几秒甚至更长时间的卡住. 但是在电脑上打开同样的网页却很快. 查找这个问题的过程比较曲折,记录下来. 抓取Android网络数据 为了调试这个问题,首先要抓取Android的网络包数据.开始时,是想用Wireshark来抓包的,但是很麻烦,tcpdump在手机要root权限. 于是转换思路,能不能在Android上设置代理,来抓包? 但是fiddler没有linux版本,于是转用BurpSuite了. 设置Androi

使用Android的硬件缩放技术优化执行效率

Unity3D研究院之使用Android的硬件缩放技术优化执行效率 http://www.xuanyusong.com/archives/3205 Android中GLSurfaceView在横竖屏切换时重新创建表面缓冲导致的问题 http://blog.k-res.net/archives/1702.html https://stackoverflow.com/questions/7185644/android-opengl-crazy-aspect-ratio-after-sleep

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

<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <appSettings> <add key="DomainProxy1" value="http://e3

android 按钮点击事件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBo

Spring 定时任务重复执行的问题分析

背景:使用quartz时客户现场不知道为什么跑着跑着就停了,后来决定换成spring定时任务. 当使用spring定时任务时莫名奇妙的就是同一时间重复执行多次任务(通常情况下执行两次,有时候会达到3次).下面记录过程并逐一分析说明,供以后参考: 1.分析原因后发现是由ClassPathXmlApplicationContext导致 通过n多次试验发现: 当任务方法中不含任何业务逻辑时(如:只打印一些标志性的信息),任务能够正常执行,没有重复执行的现象: 当任务方法中包含业务逻辑,或应用程序执行别

Windows下Android Studio长时间停留在Building &quot;Project Name&quot; Gradle project info画面的解决方法

问题描述: 创建好一个Android项目后,Android Studio长时间停留在Building [Project Name] Gradle project info画面不动. 原因: 此时Android Studio在下载gradle-X.XX-all.zip文件,但是下载过程中经常中断,导致重来(不支持断点续传?). 解决办法: 1. 首先查看gradle版本,路径:C:\Users\[用户名]\.gradle\wrapper\dists\gradle-X.XX-all 2. 然后去Gr