收到自定义的cordova插件(用于Android对按钮按下的响应)后,ionic3中的角度动画将停止工作

我正在开发一个自定义的cordova插件(目前为Android),可与Ionic一起使用。该插件使用以下代码将侦听器添加到WebView:

        this.callbackContext = callbackContext;//store this for later
        this.webView.getView().setOnKeyListener(this);//add listener
        PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT); // send no result cause the result will be sent by the listener
        pluginResult.setKeepCallback(true);
        this.callbackContext.sendPluginResult(pluginResult);

然后我以这种方式覆盖侦听器:

    @Override
    public boolean onKey(View view,int keyCode,KeyEvent keyEvent) {

        JSONObject result = new JSONObject();

        if (keyEvent.getaction() == KeyEvent.actION_DOWN) {

            if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
            {
                try {
                    result.put("button","button pressed");
                } catch (JSONException err) {
                }

            } 
            
            PluginResult pr = new PluginResult(PluginResult.Status.OK,result);
            pr.setKeepCallback(keepCallback);
            this.callbackContext.sendPluginResult(pr);
            return false;

        }
        return true;
    }

在Ionic端,我可以看到插件正确发送了结果,但似乎增加了一些怪异的行为:当从ionic接收到事件时,我的代码需要启动动画(角度动画),动画已开始,但尚未完成。它似乎卡住了。如果在收到事件后以任何方式与ui进行交互(例如,如果我只点击屏幕,一切都将再次开始工作),则该应用将再次响应 如果我以其他方式触发动画,动画效果会很好。

以这种方式创建动画:

 @Component({
...
  animations: [
    trigger('buttonAnimation',[
      state('normal',style({
        'transform': 'scale(1.0)'
      })),state('big',style({
        'transform': 'scale(1.2)',})),transition('* => *',animate('.1s ease'))
    ]),]
})

更新:

我以这种方式在模板文件中应用了动画

<button>
        <i (click)="onButtonpressed()" [@buttonAnimation]="buttonState" (@buttonAnimation.done)="onAnimationEnd()"></i>
      </button>

和来自cordova插件的回调通过设置变量来触发动画

enter code here
    this.buttonState = 'big';

然后重新使用动画

   onAnimationEnd() {
    this.buttonState = 'normal'
  }

以这种方式使用cordova插件开始动画:

cordova.plugins.buttonListener.listenButtonClick(data => {
      this.buttonState = 'big';
},err => {
});

解决方案更新

我能够使用yazantahhan提出的解决方案来解决此问题。我只需要在回调内部调用ngZone即可,因为我需要在事件到达后触发更改。

cordova.plugins.buttonListener.listenButtonClick(data => {
  this.ngZone.run(() => {
    do stuff;
  });
});
qw25585613 回答:收到自定义的cordova插件(用于Android对按钮按下的响应)后,ionic3中的角度动画将停止工作

很可能您需要强制detectChanges或在ngZone内运行它。

constructor(private ref: ChangeDetectorRef){} 

ngOnInit() {
  cordova.plugins.buttonListener.listenButtonClick(data => {
    this.buttonState = 'big';
    this.ref.detectChanges();    
  },err => { });
}

或使用ngZone:

constructor(private ngZone: NgZone){} 

ngOnInit() {
  this.ngZone.run(() => {
    cordova.plugins.buttonListener.listenButtonClick(data => {
      this.buttonState = 'big';  
     },err => { });
  });
}
本文链接:https://www.f2er.com/3166301.html

大家都在问