forked from organicmaps/organicmaps
[core] Added viewport centering animation
This commit is contained in:
parent
5f70ce2e67
commit
6f4dd2d12c
6 changed files with 23 additions and 41 deletions
|
@ -838,6 +838,16 @@ void Framework::SetViewportCenter(m2::PointD const & pt)
|
|||
Invalidate();
|
||||
}
|
||||
|
||||
shared_ptr<MoveScreenTask> Framework::SetViewportCenterAnimated(m2::PointD const & endPt)
|
||||
{
|
||||
anim::Controller::Guard guard(GetAnimController());
|
||||
ScreenBase const & s = m_navigator.Screen();
|
||||
m2::PointD const & startPt = s.GetOrg();
|
||||
double const speed = m_navigator.ComputeMoveSpeed(startPt, endPt);
|
||||
|
||||
return m_animator.MoveScreen(startPt, endPt, speed);
|
||||
}
|
||||
|
||||
m2::AnyRectD Framework::ToRotated(m2::RectD const & rect) const
|
||||
{
|
||||
double const dx = rect.SizeX();
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
#include "../std/scoped_ptr.hpp"
|
||||
#include "../std/target_os.hpp"
|
||||
|
||||
#include "move_screen_task.hpp"
|
||||
|
||||
#include "track.hpp"
|
||||
|
||||
//#define DRAW_TOUCH_POINTS
|
||||
|
@ -320,6 +322,7 @@ public:
|
|||
|
||||
m2::PointD GetViewportCenter() const;
|
||||
void SetViewportCenter(m2::PointD const & pt);
|
||||
shared_ptr<MoveScreenTask> SetViewportCenterAnimated(m2::PointD const & endPt);
|
||||
|
||||
/// Set correct viewport, parse API, show balloon.
|
||||
bool ShowMapForURL(string const & url);
|
||||
|
|
|
@ -135,13 +135,6 @@ namespace location
|
|||
setIsVisible(false);
|
||||
}
|
||||
|
||||
double State::ComputeMoveSpeed(m2::PointD const & globalPt0,
|
||||
m2::PointD const & globalPt1,
|
||||
ScreenBase const & s)
|
||||
{
|
||||
return max(0.1, min(0.5, 0.5 * s.GtoP(globalPt0).Length(s.GtoP(globalPt1)) / 50.0));
|
||||
}
|
||||
|
||||
bool State::HasPosition() const
|
||||
{
|
||||
return m_hasPosition;
|
||||
|
@ -528,30 +521,12 @@ namespace location
|
|||
|
||||
void State::AnimateToPosition()
|
||||
{
|
||||
anim::Controller * controller = m_framework->GetAnimController();
|
||||
anim::Controller::Guard guard(controller);
|
||||
|
||||
m2::PointD startPt = m_framework->GetNavigator().Screen().GetOrg();
|
||||
m2::PointD endPt = Position();
|
||||
|
||||
ScreenBase const & s = m_framework->GetNavigator().Screen();
|
||||
double speed = ComputeMoveSpeed(startPt, endPt, s);
|
||||
|
||||
m_framework->GetAnimator().MoveScreen(startPt, endPt, speed);
|
||||
m_framework->SetViewportCenterAnimated(Position());
|
||||
}
|
||||
|
||||
void State::AnimateToPositionAndEnqueueFollowing()
|
||||
{
|
||||
anim::Controller * controller = m_framework->GetAnimController();
|
||||
anim::Controller::Guard guard(controller);
|
||||
|
||||
m2::PointD const startPt = m_framework->GetNavigator().Screen().GetOrg();
|
||||
m2::PointD const endPt = Position();
|
||||
ScreenBase const & s = m_framework->GetNavigator().Screen();
|
||||
|
||||
double const speed = ComputeMoveSpeed(startPt, endPt, s);
|
||||
|
||||
shared_ptr<MoveScreenTask> const & t = m_framework->GetAnimator().MoveScreen(startPt, endPt, speed);
|
||||
shared_ptr<MoveScreenTask> const & t = m_framework->SetViewportCenterAnimated(Position());
|
||||
|
||||
t->Lock();
|
||||
t->AddCallback(anim::Task::EEnded, bind(&State::SetIsCentered, this, true));
|
||||
|
@ -561,16 +536,7 @@ namespace location
|
|||
|
||||
void State::AnimateToPositionAndEnqueueLocationProcessMode(location::ELocationProcessMode mode)
|
||||
{
|
||||
anim::Controller * controller = m_framework->GetAnimController();
|
||||
anim::Controller::Guard guard(controller);
|
||||
|
||||
m2::PointD const startPt = m_framework->GetNavigator().Screen().GetOrg();
|
||||
m2::PointD const endPt = Position();
|
||||
|
||||
ScreenBase const & s = m_framework->GetNavigator().Screen();
|
||||
double const speed = ComputeMoveSpeed(startPt, endPt, s);
|
||||
|
||||
shared_ptr<MoveScreenTask> const & t = m_framework->GetAnimator().MoveScreen(startPt, endPt, speed);
|
||||
shared_ptr<MoveScreenTask> const & t = m_framework->SetViewportCenterAnimated(Position());
|
||||
|
||||
t->Lock();
|
||||
t->AddCallback(anim::Task::EEnded, bind(&State::SetIsCentered, this, true));
|
||||
|
|
|
@ -104,10 +104,6 @@ namespace location
|
|||
|
||||
void CallCompassStatusListeners(ECompassProcessMode mode);
|
||||
|
||||
double ComputeMoveSpeed(m2::PointD const & globalPt0,
|
||||
m2::PointD const & globalPt1,
|
||||
ScreenBase const & s);
|
||||
|
||||
void CheckCompassFollowing();
|
||||
void FollowCompass();
|
||||
|
||||
|
|
|
@ -75,6 +75,11 @@ void Navigator::CenterViewport(m2::PointD const & p)
|
|||
m_StartScreen.SetOrg(pt);
|
||||
}
|
||||
|
||||
double Navigator::ComputeMoveSpeed(m2::PointD const & p0, m2::PointD const & p1) const
|
||||
{
|
||||
return max(0.1, min(0.5, 0.5 * GtoP(p0).Length(GtoP(p1)) / 50.0));
|
||||
}
|
||||
|
||||
void Navigator::SaveState()
|
||||
{
|
||||
m2::AnyRectD r = m_Screen.GlobalRect();
|
||||
|
|
|
@ -16,6 +16,8 @@ public:
|
|||
void CenterViewport(m2::PointD const & p);
|
||||
void SetFromRects(m2::AnyRectD const & glbRect, m2::RectD const & pxRect);
|
||||
|
||||
double ComputeMoveSpeed(m2::PointD const & p0, m2::PointD const & p1) const;
|
||||
|
||||
void SaveState();
|
||||
/// @return false if can't load previously saved values
|
||||
bool LoadState();
|
||||
|
|
Loading…
Add table
Reference in a new issue