我正在使用Nativescript Vue,并尝试通过Nativescript-Gesture Rotation旋转TextView标签中的文本。文本旋转,但不平滑,它从一个方向跳转到另一个方向。这是我的问题
为什么会这样? NS-手势旋转如此奇怪的原因是什么?以及如何使其工作?
我还将在此处和NS Playground中发布示例示例。
<template>
<Page class="page">
<ActionBar title="Home" class="action-bar" />
<StackLayout class="home-panel">
<TextView @rotation="onRotation" id="liveLabel" textWrap="true"
:rotate="textRotation" editable="false">
<FormattedString id="formString">
<Span id="spanText" text="Test text" fontSize="20"
color="red" />
</FormattedString>
</TextView>
</StackLayout>
</Page>
</template>
<script>
export default {
data() {
return {
textRotation: 0
};
},
methods: {
onRotation(args) {
console.log(
"Rotate angle: " + args.rotation + " state: " + args.state
);
this.textRotation = Math.floor(args.rotation);
}
}
};
</script>
答案 0 :(得分:1)
实际上,您所看到的完全是预期的,并且您正在实现。
假设您正在计算对象的位置并同时移动它,那么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>