mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
75 lines
2.4 KiB
C++
75 lines
2.4 KiB
C++
// Copyright 2014 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "config.h"
|
|
#include "platform/scroll/ProgrammaticScrollAnimator.h"
|
|
|
|
#include "platform/geometry/IntPoint.h"
|
|
#include "platform/scroll/ScrollableArea.h"
|
|
#include "public/platform/Platform.h"
|
|
#include "public/platform/WebCompositorSupport.h"
|
|
#include "public/platform/WebScrollOffsetAnimationCurve.h"
|
|
|
|
namespace blink {
|
|
|
|
PassOwnPtr<ProgrammaticScrollAnimator> ProgrammaticScrollAnimator::create(ScrollableArea* scrollableArea)
|
|
{
|
|
return adoptPtr(new ProgrammaticScrollAnimator(scrollableArea));
|
|
}
|
|
|
|
ProgrammaticScrollAnimator::ProgrammaticScrollAnimator(ScrollableArea* scrollableArea)
|
|
: m_scrollableArea(scrollableArea)
|
|
, m_startTime(0.0)
|
|
{
|
|
}
|
|
|
|
ProgrammaticScrollAnimator::~ProgrammaticScrollAnimator()
|
|
{
|
|
}
|
|
|
|
void ProgrammaticScrollAnimator::resetAnimationState()
|
|
{
|
|
m_animationCurve.clear();
|
|
m_startTime = 0.0;
|
|
}
|
|
|
|
void ProgrammaticScrollAnimator::animateToOffset(FloatPoint offset)
|
|
{
|
|
m_startTime = 0.0;
|
|
m_targetOffset = offset;
|
|
m_animationCurve = adoptPtr(Platform::current()->compositorSupport()->createScrollOffsetAnimationCurve(m_targetOffset, WebCompositorAnimationCurve::TimingFunctionTypeEaseInOut));
|
|
|
|
m_animationCurve->setInitialValue(FloatPoint(m_scrollableArea->scrollPosition()));
|
|
if (!m_scrollableArea->scheduleAnimation()) {
|
|
resetAnimationState();
|
|
m_scrollableArea->notifyScrollPositionChanged(IntPoint(offset.x(), offset.y()));
|
|
}
|
|
}
|
|
|
|
void ProgrammaticScrollAnimator::cancelAnimation()
|
|
{
|
|
resetAnimationState();
|
|
}
|
|
|
|
void ProgrammaticScrollAnimator::tickAnimation(double monotonicTime)
|
|
{
|
|
if (m_animationCurve) {
|
|
if (!m_startTime)
|
|
m_startTime = monotonicTime;
|
|
double elapsedTime = monotonicTime - m_startTime;
|
|
bool isFinished = (elapsedTime > m_animationCurve->duration());
|
|
FloatPoint offset = m_animationCurve->getValue(elapsedTime);
|
|
m_scrollableArea->notifyScrollPositionChanged(IntPoint(offset.x(), offset.y()));
|
|
|
|
if (isFinished) {
|
|
resetAnimationState();
|
|
} else if (!m_scrollableArea->scheduleAnimation()) {
|
|
m_scrollableArea->notifyScrollPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffset.y()));
|
|
resetAnimationState();
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace blink
|