На самом деле то, что вы видите, вполне ожидаемо, и вы это делаете.
Представьте, что вы рассчитываете положение на объекте и перемещаете его одновременно, поэтому событие поворота в TextView дает правильную позицию, основанную на ваших движениях пальца, а затем дает другую позицию, основанную на новом значении поворота.Вы применили к TextView.
Чтобы решить эту проблему, у вас должно быть 2 копии объекта (TextView здесь).Один для прослушивания движений пальцев, другой для анимации, что-то вроде этого.
<template>
<Page class="page">
<ActionBar title="Home" class="action-bar" />
<StackLayout class="home-panel">
<GridLayout>
<TextView ref="animatedLbl" textWrap="true" :rotate="textRotation"
editable="false" visibility="hidden" verticalAlignment="top">
<FormattedString>
<Span text="Test text" fontSize="20" color="red" />
</FormattedString>
</TextView>
<TextView ref="hostLbl" @rotation="onRotation" textWrap="true"
editable="false" verticalAlignment="top">
<FormattedString>
<Span text="Test text" fontSize="20" color="red" />
</FormattedString>
</TextView>
</GridLayout>
</StackLayout>
</Page>
</template>
<script>
import * as GestureModule from "tns-core-modules/ui/gestures";
export default {
data() {
return {
textRotation: 0
};
},
methods: {
onRotation(args) {
if (args.state === GestureModule.GestureStateTypes.began) {
this.$refs.hostLbl.nativeView.visibility = "hidden";
this.$refs.animatedLbl.nativeView.visibility = "visible";
}
this.textRotation = Math.floor(args.rotation);
if (
args.state === GestureModule.GestureStateTypes.cancelled ||
args.state === GestureModule.GestureStateTypes.ended
) {
this.$refs.hostLbl.nativeView.rotate = this.textRotation;
this.$refs.hostLbl.nativeView.visibility = "visible";
this.$refs.animatedLbl.nativeView.visibility = "hidden";
}
}
}
};
</script>
Образец игровой площадки