当我试图使用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();
}
});
1条答案
按热度按时间mcvgt66p1#
您共享的代码段无法编译,因为
doAnimation
需要您在回调中未提供的QiContext
。相反,您可以在默认情况下禁用该按钮,等待
onRobotFocusGained
回调,该回调将QiContext
提供给setOnClickListener
,然后启用该按钮。那么还有别的问题:构建和播放动画是一个很长的动作,你不能等待它在主循环中结束。
为了方便起见,我建议您将Qi SDK代码放在
onRobotFocusGained
中,它位于与主循环不同的(“工作”)线程中,然后只在OnClickListener
的回调中异步启动动画(在主循环中触发):我没有尝试代码,让我知道它是如何工作的。
最后,不要忘记,异步操作中的错误不会爬上主循环的堆栈,如果不处理它们,最终会出现在日志中。