【问题标题】:How do you send single data when the button is pressed and not looping on the inside and stop the action when the button is release按下按钮时如何发送单个数据而不是在内部循环并在释放按钮时停止动作
【发布时间】:2019-09-05 02:40:26
【问题描述】:

所以我正在使用 java 在我的移动应用程序中开发一个控制器,目前每当我触摸按钮时,它都会连续发送 3 个数据。当按钮释放时它应该只发送一个数据和另一个数据时

我可以设置在释放按钮时获取数据,但由于传递了很多数据,所以不准确

    upbtn.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            rosbridge.Publish("/set_velocity", nav_ctrl);
            if(event.getAction() == ACTION_DOWN) {
                nav_ctrl.linear.x = 0.6;
                nav_ctrl.angular.z = 0;
                return true;

            } else if (event.getAction() != MotionEvent.ACTION_UP) {
                    return false;
                }
                nav_ctrl.linear.x = 0;
                nav_ctrl.angular.z = 0;
            return false;
        }
    });

    downbtn.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            rosbridge.Publish("/set_velocity", nav_ctrl);
            if(event.getAction() == ACTION_MOVE) {
                    nav_ctrl.linear.x = -0.6;
                    nav_ctrl.angular.z = 0;
            } else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
                nav_ctrl.linear.x = 0;
                nav_ctrl.angular.z = 0;
            }
            return false;
        }
    });


    leftbtn.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            rosbridge.Publish("/set_velocity", nav_ctrl);
            if(event.getAction() == ACTION_DOWN) {
                nav_ctrl.linear.x = 1.2;
                nav_ctrl.angular.z = 0;

                return true;

            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                leftbtn.performClick();
                nav_ctrl.linear.x = 0;
                nav_ctrl.angular.z = 0;
            }
            return false;
        }
    });

    rightbtn.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            rosbridge.Publish("/set_velocity", nav_ctrl);
            if(event.getAction() == ACTION_DOWN) {
                nav_ctrl.linear.x = -1.2;
                nav_ctrl.angular.z = 0;
                return true;

            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                nav_ctrl.linear.x = 0;
                nav_ctrl.angular.z = 0;
            }
            return false;
        }
    });

}

我希望只发送一行数据,例如:"angular":{"x":0.0,"y":0.0,"z":0.0},"linear":{"x":- 0.6,"y":0.0,"z":0.0}},

输出相似,但传递了多个数据

【问题讨论】:

  • 实际输出会有帮助!

标签: android navigation ros gamecontroller


【解决方案1】:

问题在于您正在发布,无论事件类型如何。 您至少在touch 开始时发布一次,在touch 结束时至少发布一次,然后再次移动。没有检查,但如果你按住按钮,它也可能会一直开火。

将Publish 移动到ACTION_DOWN 块中

 public boolean onTouch(View v, MotionEvent event) {
            //rosbridge.Publish("/set_velocity", nav_ctrl); <--- This
            if(event.getAction() == ACTION_DOWN) {
                nav_ctrl.linear.x = 1.2;
                nav_ctrl.angular.z = 0;
                rosbridge.Publish("/set_velocity", nav_ctrl); <--- Goes here

                return true;

            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                leftbtn.performClick();
                nav_ctrl.linear.x = 0;
                nav_ctrl.angular.z = 0;
            }
            return false;
        }

【讨论】:

  • 另外,如果是实际按钮,还有一个 OnClick 事件可以使用
  • 我能够做到这一点,并在每次按下和释放按钮时传递单个数据。但是当我按下另一个按钮时,它会调用我按下大约 2-3 秒的上一个按钮在它调用自己的值之前。
  • @yenbico 如果这解决了您的问题,您可以单击答案旁边的复选标记。关于您的其他问题,如果没有看到更多代码,我不知道问题是什么。我的猜测是您需要在更改 nav_ctrl 之后调用 Publish。我会改变我的答案
  • @yenbico 另外,每个按钮的 ACTION_UP 处理方式都不同...
  • @yenbico 更新您的代码会破坏这个问题(因此其他用户无法从中学习)。如果您有问题,请再问一个问题!
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
相关资源
最近更新 更多