动画轴承 属性 随 Qml Map 变化
Animating bearing property change with Qml Map
我正在尝试在 Qml 地图上为轴承 属性 变化设置动画:
Map {
id: map
Behavior on bearing {
enabled: true
RotationAnimation {
direction: RotationAnimation.Shortest
duration: 500
easing.type: Easing.Linear
}
}
Button {
onClicked: map.bearing = 100 // animation works. Map rotation is animated
}
Button {
onClicked: map.setBearing(100, Qt.point(10,10)) // animation does not work. Map rotates immediately to the bearing
}
}
当直接使用 map.bearing
设置方位时,动画就会工作。但是当使用辅助方法 map.setBearing
时,动画不起作用。有没有办法用map.setBearing
方法把动画搞定?
此致,
我敢打赌您需要另一个单独的 setBearing 可调用动画。
您在行为中拥有的那个不能涵盖您添加的用例,因为它在 属性 上运行,而 setBearing 重载严格来说会绕过 属性 并且仅在完成后触发更新的信号。
类似
RotationAnimation {
id: bearingAnimation
target: <yourmap>
property: "myBearing"
direction: RotationAnimation.Shortest
duration: 360
function distance(a, b)
{
var mx = Math.max(a, b)
var mn = Math.min(a, b)
return Math.min( mx - mn, mn + 360 - mx)
}
function startBearingAnimation(to)
{
bearingAnimation.stop()
bearingAnimation.from = <yourmap>.bearing
bearingAnimation.to = to
if (bearingAnimation.from !== bearingAnimation.to) {
bearingAnimation.duration = distance(bearingAnimation.from, bearingAnimation.to) * 2
bearingAnimation.start()
}
}
}
然后
property real myBearing
onMyBearingChanged {
<yourmap>.setBearing(myBearing, <thepoint>)
}
我正在尝试在 Qml 地图上为轴承 属性 变化设置动画:
Map {
id: map
Behavior on bearing {
enabled: true
RotationAnimation {
direction: RotationAnimation.Shortest
duration: 500
easing.type: Easing.Linear
}
}
Button {
onClicked: map.bearing = 100 // animation works. Map rotation is animated
}
Button {
onClicked: map.setBearing(100, Qt.point(10,10)) // animation does not work. Map rotates immediately to the bearing
}
}
当直接使用 map.bearing
设置方位时,动画就会工作。但是当使用辅助方法 map.setBearing
时,动画不起作用。有没有办法用map.setBearing
方法把动画搞定?
此致,
我敢打赌您需要另一个单独的 setBearing 可调用动画。 您在行为中拥有的那个不能涵盖您添加的用例,因为它在 属性 上运行,而 setBearing 重载严格来说会绕过 属性 并且仅在完成后触发更新的信号。
类似
RotationAnimation {
id: bearingAnimation
target: <yourmap>
property: "myBearing"
direction: RotationAnimation.Shortest
duration: 360
function distance(a, b)
{
var mx = Math.max(a, b)
var mn = Math.min(a, b)
return Math.min( mx - mn, mn + 360 - mx)
}
function startBearingAnimation(to)
{
bearingAnimation.stop()
bearingAnimation.from = <yourmap>.bearing
bearingAnimation.to = to
if (bearingAnimation.from !== bearingAnimation.to) {
bearingAnimation.duration = distance(bearingAnimation.from, bearingAnimation.to) * 2
bearingAnimation.start()
}
}
}
然后
property real myBearing
onMyBearingChanged {
<yourmap>.setBearing(myBearing, <thepoint>)
}