Я разрабатываю собственный плагин 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, мойКод должен запустить анимацию (угловая анимация), анимация запускается, но не завершается. Кажется, застрял. Если я каким-либо образом взаимодействую с пользовательским интерфейсом после получения события (например, если я просто коснусь экрана, все снова начинает работать), приложение снова начинает отвечать. Анимация работает отлично, если я запускаю ее другим способом.
Анимация создается следующим образом:
@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 => {
});