当前位置:   article > 正文

QML 地图Map中加载动态路径,使用动画显示运动轨迹_qml实现地图标记点动画效果

qml实现地图标记点动画效果

在QML地图中可以显示位置,那么如果有路径的点需要动态的显示其运动轨迹,该如何实现呢?

运动点迹可以使用MapItemView加载,使用箭头表示运动的指向,相邻两个位置处的矢量偏移角度可使用Map.azimuthTo()函数计算得到。但是加载的点迹是动态的,因此需要再给箭头它加上动态的效果,动态效果的实现我采用的是间隔显示法,即每个动画周期内根据自定义点间隔显示点,同时隐藏上一周期显示的点。效果如图:

1、重构控件MapItemView:

  1. import QtQuick 2.11
  2. import QtQml 2.11
  3. import QtLocation 5.11
  4. import QtPositioning 5.11
  5. import QtGraphicalEffects 1.0
  6. MapItemView{
  7. property int arrowSize: 12//箭头尺寸
  8. property color arrowColor: "white"//箭头颜色
  9. property int arrowStep: 8//采样间隔,值越小箭头越密集
  10. property var indexArray: []//当前显示的箭头列表,用于动态效果
  11. model:ListModel{
  12. id:arrowModel
  13. }
  14. delegate:Component{
  15. ……
  16. }
  17. }

 2、实现MapItemView中的delegate,用于绘制路径箭头,代码:

  1. delegate: Component{
  2. id:arrowDelegate
  3. MapQuickItem{
  4. id:arrow
  5. width: arrowSize
  6. height: arrowSize
  7. coordinate: QtPositioning.coordinate(latitude,longitude)
  8. anchorPoint.x:arrowSize*5/3
  9. anchorPoint.y:arrowSize/2
  10. rotation: model.rotation
  11. visible: model.arrowVisible
  12. sourceItem: Image {
  13. id: image
  14. source: "qrc:/Img/MapArrow.png"
  15. sourceSize.width: arrowSize*10/3
  16. sourceSize.height: arrowSize
  17. ColorOverlay {
  18. anchors.fill: image
  19. source: image
  20. color: arrowColor
  21. }
  22. }
  23. }
  24. }

其中model中的对象为:

  1. {
  2. "latitude":list[j].latitude,//纬度
  3. "longitude":list[j].longitude,//经度
  4. "rotation":rotation,//箭头偏移角度
  5. "arrowVisible":v//当前是否显示,用于动画效果
  6. }

3、计算每个点与下一个点矢量的偏移角度:

  1. function setDataList(list){
  2. for(var j=0;j<list.length;j++){
  3. if(j<list.length-1){
  4. var jj = j+1
  5. var c1 = QtPositioning.coordinate(list[j].latitude,list[j].longitude)
  6. var c2 = QtPositioning.coordinate(list[jj].latitude,list[jj].longitude)
  7. var rotation = c1.azimuthTo(c2)
  8. var v = j%arrowStep===0
  9. if(v){
  10. indexArray.push(j)
  11. }
  12. arrowModel.append({
  13. "latitude":list[j].latitude,
  14. "longitude":list[j].longitude,
  15. "rotation":rotation,
  16. "arrowVisible":v
  17. })
  18. }
  19. }
  20. }

4、动画效果函数:

  1. function triggerRotation(){
  2. var count = arrowModel.count
  3. for(var j in indexArray){
  4. var oldIndex = indexArray[j]
  5. arrowModel.setProperty(oldIndex,"arrowVisible",false)
  6. if(oldIndex===count-1){
  7. oldIndex = -1
  8. }
  9. var newIndex = oldIndex+1
  10. indexArray[j] = newIndex
  11. arrowModel.setProperty(newIndex,"arrowVisible",true)
  12. }
  13. }

5、使用时,需要自定义一个计时器Timer,每次计时周期到时触发triggerRotation()函数即可实现箭头的动态移动:

  1. Timer{
  2. id:animationTimer
  3. interval:160
  4. running: true
  5. repeat: true
  6. onTriggered: {
  7. arrowMapView.triggerRotation()
  8. }
  9. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/117500
推荐阅读
相关标签
  

闽ICP备14008679号