用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

525 lines
16 KiB

5 months ago
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Abstraction for an Animation that can be applied to Views, Surfaces, or
* other objects. See the {@link android.view.animation animation package
* description file}.
*/
#pragma once
#include <interface/SAnimation-i.h>
#include <unknown/obj-ref-impl.hpp>
#include <animation/SInterpolatorImpl.h>
#include <animation/STransformation.h>
#include <sobject/sobject.hpp>
#define ATTR_VALUE_DESC(attribname, varType,varValue) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SValueDescription desc = SOUI::SValueDescription::parseValue(strValue);\
varType=desc.type; varValue=desc.value; \
hRet = S_FALSE; \
} \
else \
namespace SOUI {
/**
* Utility class to parse a string description of a size.
*/
class SOUI_EXP SValueDescription {
public:
/**
* One of Animation.ABSOLUTE_VALUE, Animation.RELATIVE_TO_SELF, or
* Animation.RELATIVE_TO_PARENT.
*/
IAnimation::ValueType type;
/**
* The absolute or relative dimension for this Description.
*/
float value;
/**
* Size descriptions can appear inthree forms:
* <ol>
* <li>An absolute size. This is represented by a number.</li>
* <li>A size relative to the size of the object being animated. This
* is represented by a number followed by "%".</li> *
* <li>A size relative to the size of the parent of object being
* animated. This is represented by a number followed by "%p".</li>
* </ol>
* @param value The typed value to parse
* @return The parsed version of the description
*/
static SValueDescription parseValue(const SStringW & value);
};
class SOUI_EXP SAnimation : public TObjRefImpl<SObjectImpl<IAnimation>> {
SOUI_CLASS_NAME_EX(SAnimation, L"animation", Animation)
protected:
/**
* Set by {@link #getTransformation(long, STransformation)} when the animation ends.
*/
bool mEnded;
/**
* Set by {@link #getTransformation(long, STransformation)} when the animation starts.
*/
bool mStarted;
/**
* Set by {@link #getTransformation(long, STransformation)} when the animation repeats
* in REVERSE mode.
*/
bool mCycleFlip;
/**
* The time in milliseconds at which the animation must start;
*/
int64_t mStartTime;
/**
* The delay in milliseconds after which the animation must start. When the
* start offset is > 0, the start time of the animation is startTime + startOffset.
*/
long mStartOffset;
/**
* The duration of one animation cycle in milliseconds.
*/
long mDuration;
/**
* The number of times the animation must repeat. By default, an animation repeats
* indefinitely.
*/
int mRepeatCount;
/**
* Indicates how many times the animation was repeated.
*/
int mRepeated;
/**
* The behavior of the animation when it repeats. The repeat mode is either
* {@link #RESTART} or {@link #REVERSE}.
*
*/
RepeatMode mRepeatMode;
/**
* The interpolator used by the animation to smooth the movement.
*/
SAutoRefPtr<IInterpolator> mInterpolator;
/**
* The animation listener to be notified when the animation starts, ends or repeats.
*/
IAnimationListener * mListener;
/**
* Desired Z order mode during animation.
*/
ZAdjustment mZAdjustment;
/**
* scalefactor to apply to pivot points, etc. during animation. Subclasses retrieve the
* value via getScaleFactor().
*/
float mScaleFactor;
/**
* Indicates whether the animation transformation should be applied before the
* animation starts. The value of this variable is only relevant if mFillEnabled is true;
* otherwise it is assumed to be true.
*/
bool mFillBefore;
/**
* Indicates whether the animation transformation should be applied after the
* animation ends.
*/
bool mFillAfter;
/**
* Indicates whether fillBefore should be taken into account.
*/
bool mFillEnabled;
/**
* Creates a new animation with a duration of 0ms, the default interpolator, with
* fillBefore set to true and fillAfter set to false
*/
ULONG_PTR mUserData;
SStringW mName;
int mID;
public:
SAnimation();
~SAnimation();
LPCWSTR GetName() const
{
return mName;
}
int GetID() const
{
return mID;
}
virtual IAnimation * clone() const;
/**
* Reset the initialization state of this animation.
*
* @see #initialize(int, int, int, int)
*/
virtual void initialize(int width, int height, int parentWidth, int parentHeight);
void reset();
/**
* Cancel the animation. Cancelling an animation invokes the animation
* listener, if set, to notify the end of the animation.
*
* If you cancel an animation manually, you must call {@link #reset()}
* before starting the animation again.
*
* @see #reset()
* @see #start()
* @see #startNow()
*/
void cancel();
/**
* Sets the acceleration curve for this animation. Defaults to a linear
* interpolation.
*
* @param i The interpolator which defines the acceleration curve
* @attr ref android.R.styleable#Animation_interpolator
*/
void setInterpolator(IInterpolator *i);
/**
* How long this animation should last. The duration cannot be negative.
*
* @param durationMillis Duration in milliseconds
*
* @throws java.lang.IllegalArgumentException if the duration is < 0
*
* @attr ref android.R.styleable#Animation_duration
*/
void setDuration(long durationMillis);
/**
* How much to scale the duration by.
*
* @param scale The amount to scale the duration.
*/
void scaleCurrentDuration(float scale);
void setFillBefore(bool bFill);
bool getFillBefore() const;
void setFillAfter(bool bFill);
bool getFillAfter() const;
bool isFillEnabled() const;
/**
* If fillEnabled is true, the animation will apply the value of fillBefore.
* Otherwise, fillBefore is ignored and the animation
* transformation is always applied until the animation ends.
*
* @param fillEnabled true if the animation should take the value of fillBefore into account
* @attr ref android.R.styleable#Animation_fillEnabled
*
* @see #setFillBefore(boolean)
* @see #setFillAfter(boolean)
*/
void setFillEnabled(bool fillEnabled);
void setStartOffset(long offset);
/**
* When this animation should start. When the start time is set to
* {@link #START_ON_FIRST_FRAME}, the animation will start the first time
* {@link #getTransformation(long, STransformation)} is invoked. The time passed
* to this method should be obtained by calling
* {@link AnimationUtils#currentAnimationTimeMillis()} instead of
* {@link System#currentTimeMillis()}.
*
* @param startTimeMillis the start time in milliseconds
*/
void setStartTime(int64_t startTimeMillis);
/**
* Convenience method to start the animation the first time
* {@link #getTransformation(long, STransformation)} is invoked.
*/
void start();
/**
* Convenience method to start the animation at the current time in
* milliseconds.
*/
void startNow();
/**
* Defines what this animation should do when it reaches the end. This
* setting is applied only when the repeat count is either greater than
* 0 or {@link #INFINITE}. Defaults to {@link #RESTART}.
*
* @param repeatMode {@link #RESTART} or {@link #REVERSE}
* @attr ref android.R.styleable#Animation_repeatMode
*/
void setRepeatMode(RepeatMode repeatMode);
/**
* Sets how many times the animation should be repeated. If the repeat
* count is 0, the animation is never repeated. If the repeat count is
* greater than 0 or {@link #INFINITE}, the repeat mode will be taken
* into account. The repeat count is 0 by default.
*
* @param repeatCount the number of times the animation should be repeated
* @attr ref android.R.styleable#Animation_repeatCount
*/
void setRepeatCount(int repeatCount);
/**
* Set the Z ordering mode to use while running the animation.
*
* @param zAdjustment The desired mode, one of {@link #ZORDER_NORMAL},
* {@link #ZORDER_TOP}, or {@link #ZORDER_BOTTOM}.
* @attr ref android.R.styleable#Animation_zAdjustment
*/
void setZAdjustment(ZAdjustment zAdjustment);
/**
* Gets the acceleration curve type for this animation.
*
* @return the {@link Interpolator} associated to this animation
* @attr ref android.R.styleable#Animation_interpolator
*/
IInterpolator* getInterpolator() const;
/**
* When this animation should start. If the animation has not startet yet,
* this method might return {@link #START_ON_FIRST_FRAME}.
*
* @return the time in milliseconds when the animation should start or
* {@link #START_ON_FIRST_FRAME}
*/
int64_t getStartTime() const;
/**
* How long this animation should last
*
* @return the duration in milliseconds of the animation
* @attr ref android.R.styleable#Animation_duration
*/
virtual long getDuration() const;
/**
* When this animation should start, relative to StartTime
*
* @return the start offset in milliseconds
* @attr ref android.R.styleable#Animation_startOffset
*/
virtual long getStartOffset() const;
/**
* Defines what this animation should do when it reaches the end.
*
* @return either one of {@link #REVERSE} or {@link #RESTART}
* @attr ref android.R.styleable#Animation_repeatMode
*/
virtual RepeatMode getRepeatMode() const;
/**
* Defines how many times the animation should repeat. The default value
* is 0.
*
* @return the number of times the animation should repeat, or {@link #INFINITE}
* @attr ref android.R.styleable#Animation_repeatCount
*/
virtual int getRepeatCount() const;
/**
* Returns the Z ordering mode to use while running the animation as
* previously set by {@link #setZAdjustment}.
*
* @return Returns one of {@link #ZORDER_NORMAL},
* {@link #ZORDER_TOP}, or {@link #ZORDER_BOTTOM}.
* @attr ref android.R.styleable#Animation_zAdjustment
*/
virtual ZAdjustment getZAdjustment() const;
/**
* <p>Binds an animation listener to this animation. The animation listener
* is notified of animation events such as the end of the animation or the
* repetition of the animation.</p>
*
* @param listener the animation listener to be notified
*/
void setAnimationListener(IAnimationListener* listener);
public:
/**
* Compute a hint at how long the entire animation may last, in milliseconds.
* Animations can be written to cause themselves to run for a different
* duration than what is computed here, but generally this should be
* accurate.
*/
long computeDurationHint() const;
/**
* Gets the transformation to apply at a specified point in time. Implementations of this
* method should always replace the specified STransformation or document they are doing
* otherwise.
*
* @param currentTime Where we are in the animation. This is wall clock time.
* @param outTransformation A transformation object that is provided by the
* caller and will be filled in by the animation.
* @param scale Scaling factor to apply to any inputs to the transform operation, such
* pivot points being rotated or scaled around.
* @return True if the animation is still running
*/
bool getTransformation(uint64_t currentTime, STransformation & outTransformation, float scale);
/**
* Gets the transformation to apply at a specified point in time. Implementations of this
* method should always replace the specified STransformation or document they are doing
* otherwise.
*
* @param currentTime Where we are in the animation. This is wall clock time.
* @param outTransformation A transformation object that is provided by the
* caller and will be filled in by the animation.
* @return True if the animation is still running
*/
virtual bool getTransformation(int64_t currentTime, STransformation & outTransformation);
protected:
/**
* Helper for getTransformation. Subclasses should implement this to apply
* their transforms given an interpolation value. Implementations of this
* method should always replace the specified STransformation or document
* they are doing otherwise.
*
* @param interpolatedTime The value of the normalized time (0.0 to 1.0)
* after it has been run through the interpolation function.
* @param t The STransformation object to fill in with the current
* transforms.
*/
virtual void applyTransformation(float interpolatedTime, STransformation & t);
protected:
virtual void copy(const IAnimation * src);
bool isCanceled();
void fireAnimationStart();
void fireAnimationRepeat();
void fireAnimationEnd();
/**
* Convert the information in the description of a size to an actual
* dimension
*
* @param type One of Animation.ABSOLUTE_VALUE, Animation.RELATIVE_TO_SELF, or
* Animation.RELATIVE_TO_PARENT.
* @param value The dimension associated with the type parameter
* @param size The size of the object being animated
* @param parentSize The size of the parent of the object being animated
* @return The dimension to use for the animation
*/
int resolveSize(ValueType type, float value, int size, int parentSize);
/**
* Gurantees that this animation has an interpolator. Will use
* a AccelerateDecelerateInterpolator is nothing else was specified.
*/
void ensureInterpolator();
/**
* The scale factor is set by the call to <code>getTransformation</code>. Overrides of
* {@link #getTransformation(long, STransformation, float)} will get this value
* directly. Overrides of {@link #applyTransformation(float, STransformation)} can
* call this method to get the value.
*
* @return float The scale factor that should be applied to pre-scaled values in
* an Animation such as the pivot points in {@link ScaleAnimation} and {@link RotateAnimation}.
*/
float getScaleFactor();
public:
/**
* <p>Indicates whether this animation has started or not.</p>
*
* @return true if the animation has started, false otherwise
*/
bool hasStarted() const;
/**
* <p>Indicates whether this animation has ended or not.</p>
*
* @return true if the animation has ended, false otherwise
*/
bool hasEnded() const;
/**
* Return true if this animation changes the view's alpha property.
*
* @hide
*/
virtual bool hasAlpha() const;
virtual void setUserData(ULONG_PTR data);
virtual ULONG_PTR getUserData() const;
public:
SOUI_ATTRS_BEGIN()
ATTR_STRINGW(L"name", mName, FALSE)
ATTR_INT(L"id", mID, FALSE)
ATTR_INT(L"duration", mDuration, FALSE)
ATTR_INT(L"startOffset", mStartOffset, FALSE)
ATTR_BOOL(L"fillEnable", mFillEnabled, FALSE)
ATTR_BOOL(L"fillBefore", mFillBefore, FALSE)
ATTR_BOOL(L"fillAfter", mFillAfter, FALSE)
ATTR_INT(L"repeatCount", mRepeatCount, FALSE)
ATTR_ENUM_BEGIN(L"zAdjustment",ZAdjustment,FALSE)
ATTR_ENUM_VALUE(L"normal", ZORDER_NORMAL)
ATTR_ENUM_VALUE(L"top", ZORDER_TOP)
ATTR_ENUM_VALUE(L"bottom", ZORDER_BOTTOM)
ATTR_ENUM_END(mZAdjustment)
ATTR_ENUM_BEGIN(L"repeatMode", RepeatMode, FALSE)
ATTR_ENUM_VALUE(L"restart", RESTART)
ATTR_ENUM_VALUE(L"reverse", REVERSE)
ATTR_ENUM_END(mRepeatMode)
ATTR_INTERPOLATOR(L"interpolator", mInterpolator, FALSE)
ATTR_CHAIN_PTR(mInterpolator, 0)
SOUI_ATTRS_END()
};
}