如何让胡椒机器人说话或做动画后,点击平板电脑上使用Java在Android Studio中的按钮?

ruarlubt  于 2023-01-26  发布在  Android
关注(0)|答案(1)|浏览(128)

当我试图使用setOnClickListener让Pepper说些什么或做一个动画时,应用程序崩溃了。但是,如果我尝试相同的代码,方法onRobotFocusedGained它工作正常。
我尝试了多种方法,其中之一是创建一个方法让Pepper做动画,然后在setOnClickListener中调用该方法,如下所示:

private void doAnimation(QiContext qiContext){
// Create an animation object.
Animation myAnimation = AnimationBuilder.with(qiContext)
        .withResources(R.raw.sniffing_b001)
        .build();

// Build the action.
Animate animate = AnimateBuilder.with(qiContext)
        .withAnimation(myAnimation)
        .build();

animate.run();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Register the RobotLifecycleCallbacks to this Activity.
    QiSDK.register(this, this);
    ImageButton button1= findViewById(R.id.button1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            doAnimation();
        }
    });
mcvgt66p

mcvgt66p1#

您共享的代码段无法编译,因为doAnimation需要您在回调中未提供的QiContext
相反,您可以在默认情况下禁用该按钮,等待onRobotFocusGained回调,该回调将QiContext提供给setOnClickListener,然后启用该按钮。
那么还有别的问题:构建和播放动画是一个很长的动作,你不能等待它在主循环中结束。
为了方便起见,我建议您将Qi SDK代码放在onRobotFocusGained中,它位于与主循环不同的(“工作”)线程中,然后只在OnClickListener的回调中异步启动动画(在主循环中触发):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Register the RobotLifecycleCallbacks to this Activity.
    QiSDK.register(this, this);
    ImageButton button1 = findViewById(R.id.button1);
    button1.setEnabled(false);
}

@Override
protected void onRobotFocusGained(QiContext qiContext) {
    // Create an animation object.
    Animation myAnimation = AnimationBuilder.with(qiContext)
        .withResources(R.raw.sniffing_b001)
        .build();

    // Build the action.
    final Animate animate = AnimateBuilder.with(qiContext)
        .withAnimation(myAnimation)
        .build();

    // On click, run it.
    ImageButton button1 = findViewById(R.id.button1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            animate.async().run();
        }
    });
    button1.setEnabled(true);
}

@Override
protected void onRobotFocusLost(QiContext qiContext) {
    ImageButton button1 = findViewById(R.id.button1);
    button1.setOnClickListener(null);
    button1.setEnabled(false);
}

我没有尝试代码,让我知道它是如何工作的。
最后,不要忘记,异步操作中的错误不会爬上主循环的堆栈,如果不处理它们,最终会出现在日志中。

相关问题