Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(452)

Unified Diff: ui/gfx/compositor/layer_animator.h

Issue 8247009: Explicit animation support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix VS2010 Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/compositor/layer_animation_sequence_unittest.cc ('k') | ui/gfx/compositor/layer_animator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/compositor/layer_animator.h
diff --git a/ui/gfx/compositor/layer_animator.h b/ui/gfx/compositor/layer_animator.h
index 52b8870b66c4ddb43faa696f24652619ac704617..a51079c46a8e205e73c5fa94eea84aa01c2fced0 100644
--- a/ui/gfx/compositor/layer_animator.h
+++ b/ui/gfx/compositor/layer_animator.h
@@ -6,119 +6,200 @@
#define UI_GFX_COMPOSITOR_LAYER_ANIMATOR_H_
#pragma once
-#include <map>
+#include <deque>
+#include <vector>
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
+#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
-#include "third_party/skia/include/core/SkScalar.h"
-#include "third_party/skia/include/utils/SkMatrix44.h"
-#include "ui/base/animation/animation_delegate.h"
+#include "base/time.h"
+#include "ui/base/animation/animation_container_element.h"
#include "ui/gfx/compositor/compositor_export.h"
+#include "ui/gfx/compositor/layer_animation_element.h"
namespace gfx {
-class Point;
+class Rect;
}
namespace ui {
-
class Animation;
class Layer;
-class LayerAnimatorDelegate;
+class LayerAnimationSequence;
class Transform;
-// LayerAnimator manages animating various properties of a Layer.
-class COMPOSITOR_EXPORT LayerAnimator : public ui::AnimationDelegate {
+// When a property of layer needs to be changed it is set by way of
+// LayerAnimator. This enables LayerAnimator to animate property
+// changes.
+class COMPOSITOR_EXPORT LayerAnimator : public AnimationContainerElement {
public:
- // Types of properties that can be animated.
- enum AnimationProperty {
- LOCATION,
- OPACITY,
- TRANSFORM,
+ enum PreemptionStrategy {
+ IMMEDIATELY_SET_NEW_TARGET,
+ IMMEDIATELY_ANIMATE_TO_NEW_TARGET,
+ ENQUEUE_NEW_ANIMATION,
+ REPLACE_QUEUED_ANIMATIONS,
+ BLEND_WITH_CURRENT_ANIMATION
};
- explicit LayerAnimator(Layer* layer);
+ explicit LayerAnimator(base::TimeDelta transition_duration);
virtual ~LayerAnimator();
- // Sets the animation to use. LayerAnimator takes ownership of the animation.
- void SetAnimation(Animation* animation);
+ // No implicit animations when properties are set.
+ static LayerAnimator* CreateDefaultAnimator();
+
+ // Implicitly animates when properties are set.
+ static LayerAnimator* CreateImplicitAnimator();
+
+ // Sets the transform on the delegate. May cause an implicit animation.
+ virtual void SetTransform(const Transform& transform);
+
+ // Sets the bounds on the delegate. May cause an implicit animation.
+ virtual void SetBounds(const gfx::Rect& bounds);
+
+ // Sets the opacity on the delegate. May cause an implicit animation.
+ virtual void SetOpacity(float opacity);
+
+ // Sets the layer animation delegate the animator is associated with. The
+ // animator does not own the delegate.
+ void SetDelegate(LayerAnimationDelegate* delegate);
- ui::Layer* layer() { return layer_; }
+ // Sets the animation preemption strategy. This determines the behaviour if
+ // a property is set during an animation. The default is
+ // IMMEDIATELY_SET_NEW_TARGET (see ImmediatelySetNewTarget below).
+ void set_preemption_strategy(PreemptionStrategy strategy) {
+ preemption_strategy_ = strategy;
+ }
- // Animates the layer to the specified point. The point is relative to the
- // parent layer.
- void AnimateToPoint(const gfx::Point& target);
+ // Start an animation sequence. If an animation for the same property is in
+ // progress, it needs to be interrupted with the new animation. The animator
+ // takes ownership of this animation sequence.
+ void StartAnimation(LayerAnimationSequence* animation);
- // Animates the transform from the current transform to |transform|.
- void AnimateTransform(const Transform& transform);
+ // Schedule an animation to be run when possible. The animator takes ownership
+ // of this animation sequence.
+ void ScheduleAnimation(LayerAnimationSequence* animation);
- // Animates the opacity from the current opacity to |target_opacity|.
- void AnimateOpacity(float target_opacity);
+ // Schedules the animations to be run together. Obviously will no work if
+ // they animate any common properties. The animator takes ownership of the
+ // animation sequences.
+ void ScheduleTogether(const std::vector<LayerAnimationSequence*>& animations);
- // Returns the target value for the specified type. If the specified property
- // is not animating, the current value is returned.
- gfx::Point GetTargetPoint();
- float GetTargetOpacity();
- ui::Transform GetTargetTransform();
+ // Returns true if there is an animation in the queue (animations remain in
+ // the queue until they complete).
+ bool is_animating() const { return !animation_queue_.empty(); }
- // Returns true if animating |property|.
- bool IsAnimating(AnimationProperty property) const;
+ // Stops animating the given property. No effect if there is no running
+ // animation for the given property. Skips to the final state of the
+ // animation.
+ void StopAnimatingProperty(
+ LayerAnimationElement::AnimatableProperty property);
- // Returns true if the animation is running.
- bool IsRunning() const;
+ // Stops all animation and clears any queued animations.
+ void StopAnimating();
- // Returns true if the animation has progressed at least once since
- // SetAnimation() was invoked.
- bool got_initial_tick() const { return got_initial_tick_; }
+ // For testing purposes only.
+ void set_disable_timer_for_test(bool enabled) {
+ disable_timer_for_test_ = enabled;
+ }
+ base::TimeTicks get_last_step_time_for_test() { return last_step_time_; }
- // AnimationDelegate:
- virtual void AnimationProgressed(const Animation* animation) OVERRIDE;
- virtual void AnimationEnded(const Animation* animation) OVERRIDE;
+ protected:
+ LayerAnimationDelegate* delegate() { return delegate_; }
private:
- // Parameters used when animating the location.
- struct LocationParams {
- int start_x;
- int start_y;
- int target_x;
- int target_y;
+ // We need to keep track of the start time of every running animation.
+ struct RunningAnimation {
+ RunningAnimation(LayerAnimationSequence* sequence,
+ base::TimeTicks start_time)
+ : sequence(sequence),
+ start_time(start_time) {
+ }
+ LayerAnimationSequence* sequence;
+ base::TimeTicks start_time;
};
- // Parameters used when animating the transform.
- struct TransformParams {
- SkMScalar start[16];
- SkMScalar target[16];
- };
+ typedef std::vector<RunningAnimation> RunningAnimations;
+ typedef std::deque<linked_ptr<LayerAnimationSequence> > AnimationQueue;
- // Parameters used when animating the opacity.
- struct OpacityParams {
- float start;
- float target;
- };
+ // Implementation of AnimationContainerElement
+ virtual void SetStartTime(base::TimeTicks start_time) OVERRIDE;
+ virtual void Step(base::TimeTicks time_now) OVERRIDE;
+ virtual base::TimeDelta GetTimerInterval() const OVERRIDE;
- union Params {
- LocationParams location;
- OpacityParams opacity;
- TransformParams transform;
- };
+ // Starts or stops stepping depending on whether thare are running animations.
+ void UpdateAnimationState();
+
+ // Removes the sequences from both the running animations and the queue.
+ void RemoveAnimation(LayerAnimationSequence* sequence);
+
+ // Progresses to the end of the sequence before removing it.
+ void FinishAnimation(LayerAnimationSequence* sequence);
+
+ // Finishes any running animation with zero duration.
+ void FinishAnyAnimationWithZeroDuration();
+
+ // Clears the running animations and the queue. No sequences are progressed.
+ void ClearAnimations();
+
+ // Returns the running animation animating the given property, if any.
+ RunningAnimation* GetRunningAnimation(
+ LayerAnimationElement::AnimatableProperty property);
+
+ // Checks if the sequence has already been added to the queue and adds it
+ // to the front if note.
+ void AddToQueueIfNotPresent(LayerAnimationSequence* sequence);
+
+ // Any running or queued animation that affects a property in common with
+ // |sequence| is either finished or aborted depending on |abort|.
+ void RemoveAllAnimationsWithACommonProperty(LayerAnimationSequence* sequence,
+ bool abort);
+
+ // Preempts a running animation by progressing both the running animation and
+ // the given sequence to the end.
+ void ImmediatelySetNewTarget(LayerAnimationSequence* sequence);
+
+ // Preempts by aborting the running animation, and starts the given animation.
+ void ImmediatelyAnimateToNewTarget(LayerAnimationSequence* sequence);
+
+ // Preempts by adding the new animation to the queue.
+ void EnqueueNewAnimation(LayerAnimationSequence* sequence);
+
+ // Preempts by wiping out any unstarted animation in the queue and then
+ // enqueuing this animation.
+ void ReplaceQueuedAnimations(LayerAnimationSequence* sequence);
+
+ // If there's an animation in the queue that doesn't animate the same property
+ // as a running animation, or an animation schedule to run before it, start it
+ // up. Repeat until there are no such animations.
+ void ProcessQueue();
+
+ // Attempts to add the sequence to the list of running animations. Returns
+ // false if there is an animation running that already animates one of the
+ // properties affected by |sequence|.
+ bool StartSequenceImmediately(LayerAnimationSequence* sequence);
+
+ // This is the queue of animations to run.
+ AnimationQueue animation_queue_;
- typedef std::map<AnimationProperty, Params> Elements;
+ // The target of all layer animations.
+ LayerAnimationDelegate* delegate_;
- // Stops animating the specified property. This does not set the property
- // being animated to its final value.
- void StopAnimating(AnimationProperty property);
+ // The currently running animations.
+ RunningAnimations running_animations_;
- LayerAnimatorDelegate* delegate();
+ // Determines how animations are replaced.
+ PreemptionStrategy preemption_strategy_;
- // The layer.
- Layer* layer_;
+ // The default length of animations.
+ base::TimeDelta transition_duration_;
- // Properties being animated.
- Elements elements_;
+ // Used for coordinating the starting of animations.
+ base::TimeTicks last_step_time_;
- scoped_ptr<ui::Animation> animation_;
+ // True if we are being stepped by our container.
+ bool is_started_;
- bool got_initial_tick_;
+ // This prevents the animator from automatically stepping through animations
+ // and allows for manual stepping.
+ bool disable_timer_for_test_;
DISALLOW_COPY_AND_ASSIGN(LayerAnimator);
};
« no previous file with comments | « ui/gfx/compositor/layer_animation_sequence_unittest.cc ('k') | ui/gfx/compositor/layer_animator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698