我正在开发一个自定义的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;
});
});