/* * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * 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. */ /** * @addtogroup UI_Components * @{ * * @brief Defines UI components such as buttons, texts, images, lists, and progress bars. * * @since 1.0 * @version 1.0 */ /** * @file ui_image_animator.h * * @brief Defines the attributes and functions of an image animator. * * @since 1.0 * @version 1.0 */ #ifndef GRAPHIC_LITE_UI_IMAGE_ANIMATOR_H #define GRAPHIC_LITE_UI_IMAGE_ANIMATOR_H #include "animator/animator.h" #include "components/ui_image_view.h" #include "gfx_utils/graphic_types.h" namespace OHOS { /** * @brief Provides information about the images. */ struct ImageAnimatorInfo { union { /** Image path */ const char* imagePath; /** Pointer to the {@link ImageInfo} structure */ const ImageInfo* imageInfo; }; /** Image start position, relative to this view */ Point pos; /** Image width */ int16_t width; /** Image height */ int16_t height; /** Image type */ ImageType imageType; }; /** * @brief Represents an image animator. * * Images are switched at a specified interval to form an animator. * * @see UIImageView * @since 1.0 * @version 1.0 */ class UIImageAnimatorView : public UIImageView { public: /** * @brief A constructor used to create a UIImageAnimatorView instance. * * @since 1.0 * @version 1.0 */ UIImageAnimatorView(); /** * @brief A destructor used to delete the UIImageAnimatorView instance. * * @since 1.0 * @version 1.0 */ virtual ~UIImageAnimatorView(); /** * @brief Obtains the view type. * * @return Returns the view type, as defined in {@link UIViewType}. * @since 1.0 * @version 1.0 */ UIViewType GetViewType() const override { return UI_IMAGE_ANIMATOR_VIEW; } /** * @brief Sets the images and speed for this animator. * * @param imageSrc Indicates the pointer to the {@link ImageAnimatorInfo} array for storing the configured * image information. The memory cannot be released before this animator stops. * @param imageNum Indicates the number of images. * @param timeOfUpdate Indicates the interval for updating images, in milliseconds. The default value is 1. * @see GetTimeOfUpdate | GetImageAnimatorSrc | GetImageAnimatorImageNum * @since 1.0 * @version 1.0 */ void SetImageAnimatorSrc(const ImageAnimatorInfo imageSrc[], uint8_t imageNum, uint16_t timeOfUpdate); /** * @brief Sets the images for this animator. * * @param imageSrc Indicates the pointer to the {@link ImageAnimatorInfo} array for storing the configured * image information. The memory cannot be released before this animator stops. * @param imageNum Indicates the number of images. * @see GetImageAnimatorSrc | GetImageAnimatorImageNum * @since 1.0 * @version 1.0 */ void SetImageAnimatorSrc(const ImageAnimatorInfo imageSrc[], uint8_t imageNum); /** * @brief Sets the speed for this animator. * * @param timeOfUpdate Indicates the interval for updating images, in milliseconds. * @see GetTimeOfUpdate * @since 1.0 * @version 1.0 */ void SetTimeOfUpdate(uint16_t timeOfUpdate); /** * @brief Obtains the speed of this animator. * * @return Returns the interval for updating images, in milliseconds. * @see SetTimeOfUpdate * @since 1.0 * @version 1.0 */ uint16_t GetTimeOfUpdate() const; /** * @brief Sets the interval between two playbacks of an infinitely repeated animator. * * @param timeOfPause Indicates the interval between two playbacks of an infinitely repeated animator, in * milliseconds. The default value is 0, indicating that there is no interval. * @see GetTimeOfPause * @since 1.0 * @version 1.0 */ void SetTimeOfPause(uint16_t timeOfPause); /** * @brief Obtains the interval between two playbacks of an infinitely repeated animator. * * @return Returns the interval between two playbacks, in milliseconds. * @see SetTimeOfPause * @since 1.0 * @version 1.0 */ uint16_t GetTimeOfPause() const; /** * @brief Obtains the image array of this frame animator. * * @return Returns a pointer to the {@link ImageAnimatorInfo} array if the operation is successful; * returns nullptr otherwise. * @since 1.0 * @version 1.0 */ const ImageAnimatorInfo* GetImageAnimatorSrc() const; /** * @brief Obtains the number of images. * * @return Returns the number of images. * @since 1.0 * @version 1.0 */ uint8_t GetImageAnimatorImageNum() const; /** * @brief Sets whether the image size is fixed to the view size. * * @param fixed Specifies whether the image size is fixed to the view size. The value true indicates * the size of the image is the same as that of the view, and false indicates the * position and size of this image need to be set in the {@link ImageAnimatorInfo} structure. * @see IsSizeFixed * @since 1.0 * @version 1.0 */ void SetSizeFixed(bool fixed) { sizeFixed_ = fixed; } /** * @brief Checks whether the image size is fixed to the view size. * * @return Returns true if the image size is fixed to the view size; * returns false if the image size is set independently. * @see SetSizeFixed * @since 1.0 * @version 1.0 */ bool IsSizeFixed() const { return sizeFixed_; } /** * @brief Sets whether to play this animator for infinite times. * * @param repeat Specifies whether the animator is played for infinite times. true (default value) * indicates the animator is played for infinite times, and false indicates the animator * is played a specified number of times. * @see IsRepeat * @since 1.0 * @version 1.0 */ void SetRepeat(bool repeat) { repeat_ = repeat; } /** * @brief Checks whether this animator is played for infinite times. * * @return Returns true if this animator is played for infinite times, returns false if the * animator is played a specified number of times. * @see SetRepeat * @since 1.0 * @version 1.0 */ bool IsRepeat() const { return repeat_; } /** * @brief Sets the playback times for this animator. * * This function takes effect only when repeat is set to false in {@link SetRepeat}. * * @param times Indicates the playback times to set. The default value is 1. * @see GetRepeatTimes * @since 1.0 * @version 1.0 */ void SetRepeatTimes(uint32_t times) { repeatTimes_ = times; } /** * @brief Obtains the playback times. * * @return Returns the playback times. * @see SetRepeatTimes * @since 1.0 * @version 1.0 */ uint32_t GetRepeatTimes() const { return repeatTimes_; } /** * @brief Obtains the current state of this animator. * * @return Returns the current state, which can be {@link START}, {@link STOP}, or {@link PAUSE}. * For details, see {@link Animator}. * @since 1.0 * @version 1.0 */ uint8_t GetState() const { return imageAnimator_.GetState(); } /** * @brief Sets the playback sequence for this animator. * * @param reverse Indicates the playback sequence to set. true indicates a reverse playback * and false (default value) indicates a forward playback. * @see IsReverse * @since 1.0 * @version 1.0 */ void SetReverse(bool reverse) { reverse_ = reverse; } /** * @brief Obtains the playback sequence of this animator. * * @return Returns true if a reverse playback is performed; * returns false if a forward playback is performed. * @see SetReverse * @since 1.0 * @version 1.0 */ bool IsReverse() const { return reverse_; } /** * @brief Sets the attribute value for the end frame of this animator. * * @param fillMode Indicates the attribute value for the end frame of this animator. * When a forward playback is performed, the value true indicates setting the end frame of * this animator to the last one of the image set, and false indicates setting the end frame * of this animator to the first one of the image set. When a reverse playback is performed, * the value true indicates setting the end frame of this animator to the first one of * the image set, and false indicates setting the end frame of this animator to the last one * of the image set. The default value is true. * @see GetFillMode * @since 3.0 * @version 5.0 */ void SetFillMode(bool fillMode) { fillMode_ = fillMode; } /** * @brief Obtains the attribute value of the last frame of this animator. * * @return Returns true if the last frame of this animator is the last one of the image set when * a forward playback is performed, or if the last frame of this animator is the first one of the image set * when a reverse playback is performed; * returns false if the last frame of this animator is the first one of the image set when * a forward playback is performed, or if the last frame of this animator is the last one of the image set * when a reverse playback is performed. * * @see SetFillMode * @since 3.0 * @version 5.0 */ bool GetFillMode() const { return fillMode_; } /** * @brief Starts this animator. * * The forward playback starts from the first image and the reverse playback starts from the last image. * * @see Stop * @since 1.0 * @version 1.0 */ void Start(); /** * @brief Stops this animator. * * @see Start * @since 1.0 * @version 1.0 */ void Stop(); /** * @brief Pauses this animator at the current image. * * @see Resume * @since 1.0 * @version 1.0 */ void Pause(); /** * @brief Resumes this animator from the current image. * * @see Pause * @since 1.0 * @version 1.0 */ void Resume(); /** * @brief Represents a listener that contains a callback to be invoked when this animator stops. * * @since 1.0 * @version 1.0 */ class AnimatorStopListener : public HeapBase { public: /** * @brief A destructor used to delete an AnimatorStopListener instance. * * @since 1.0 * @version 1.0 */ virtual ~AnimatorStopListener() {} /** * @brief Called when this animator stops. * * You need to inherit from the AnimatorStopListener class and implement this function. * * @param view Indicates the instance of this view. * @since 1.0 * @version 1.0 */ virtual void OnAnimatorStop(UIView& view) {} }; /** * @brief Sets the listener for the stop of this animator. * * @param listener Indicates the listener to set. For details, see {@link AnimatorStopListener}. * @since 1.0 * @version 1.0 */ void SetAnimatorStopListener(AnimatorStopListener* listener) { listener_ = listener; } protected: class ImageAnimatorCallback : public AnimatorCallback { public: ImageAnimatorCallback() : tickNum_(0), loop_(1), drawingImage_(0), repeat_(0), imageSrc_(nullptr), imageNum_(0) { } virtual ~ImageAnimatorCallback() {} void Callback(UIView* view) override; void Reset() { tickNum_ = 0; loop_ = 1; repeat_ = 0; } protected: uint16_t tickNum_; uint8_t loop_; uint8_t drawingImage_; uint32_t repeat_; const ImageAnimatorInfo* imageSrc_; uint8_t imageNum_; }; void Reset(bool fillMode); void UpdateImage(uint8_t& drawingImage, uint8_t& loop); uint8_t GetTickByTime(uint16_t time) const; ImageAnimatorInfo* imageSrc_; uint8_t imageNum_; uint8_t tickOfUpdate_; uint16_t timeOfUpdate_; uint16_t timeOfPause_; uint8_t tickOfPause_; uint32_t repeatTimes_; Animator imageAnimator_; ImageAnimatorCallback imageAnimatorCallback_; AnimatorStopListener* listener_; bool reverse_; bool repeat_; bool sizeFixed_; bool fillMode_; }; } // namespace OHOS #endif // GRAPHIC_LITE_UI_IMAGE_ANIMATOR_H