QGraphicsView实现简易地图13『平移与偏移-动画效果』

前文链接: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);
	}
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生卍流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值