前文链接:QGraphicsView实现简易地图12『平移与偏移』
前一篇文章提供的地图平移与偏移功能比较生硬,会瞬间平移或偏移到目标点,本篇文章提供动画效果。
1、动态演示效果
2、核心代码
void WHMapView::panTo(const QPointF &geoCenter, bool animate/* = false*/)
{
m_geoCoord = GeoCoord(geoCenter.x(), geoCenter.y());
// 经纬度坐标转场景坐标、视图定位到中心点
QPointF offsetPos = QPointF(viewport()->width() / 2.0, viewport()->height() / 2.0);
QPointF scenePos = MapUtility::sceneCoordFromGeoCoord(m_geoCoord, m_curLevel);
if (animate)
{
QPoint viewPos = mapFromScene(scenePos);
if (viewport()->rect().contains(viewPos))
{
hideGraticules();
if (m_animation->state() != QAbstractAnimation::Stopped)
m_animation->stop();
m_animation->setStartValue(QPoint(horizontalScrollBar()->value(), verticalScrollBar()->value()));
m_animation->setEndValue(QPoint(scenePos.x() - offsetPos.x(), scenePos.y() - offsetPos.y()));
m_animation->start();
return;
}
}
horizontalScrollBar()->setValue(scenePos.x() - offsetPos.x());
verticalScrollBar()->setValue(scenePos.y() - offsetPos.y());
moveScene();
emit geoCoordChanged(m_geoCoord);
}
// 这里只提供panTop函数的实现,其它三个原理与之一致
void WHMapView::panTop(bool animate/* = false*/)
{
double offsetValue = 4.0;
QPointF scenePos = mapToScene(viewport()->width() / 2.0, viewport()->height() / offsetValue);
m_geoCoord = MapUtility::geoCoordFromScene(scenePos, m_curLevel);
if (animate)
{
hideGraticules();
if (m_animation->state() != QAbstractAnimation::Stopped)
m_animation->stop();
m_animation->setStartValue(QPoint(horizontalScrollBar()->value(), verticalScrollBar()->value()));
m_animation->setEndValue(QPoint(horizontalScrollBar()->value(), verticalScrollBar()->value() + viewport()->height() / offsetValue));
m_animation->start();
}
else
{
verticalScrollBar()->setValue(verticalScrollBar()->value() + viewport()->height() / offsetValue);
moveScene();
emit geoCoordChanged(m_geoCoord);
}
}