1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_RENDER_LOADING_PROGRESS_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_RENDER_LOADING_PROGRESS_H 18 19 #include <vector> 20 21 #include "core/animation/animator.h" 22 #include "core/animation/picture_animation.h" 23 #include "core/components/progress/loading_progress_component.h" 24 #include "core/pipeline/base/render_node.h" 25 26 namespace OHOS::Ace { 27 28 constexpr int32_t TOTAL_FRAME_NUMBER = 60; 29 constexpr int32_t MODE_DRAG = 0; 30 constexpr int32_t MODE_LOOP = 1; 31 constexpr int32_t MODE_EXIT = 2; 32 33 class RenderLoadingProgress : public RenderNode { 34 DECLARE_ACE_TYPE(RenderLoadingProgress, RenderNode); 35 36 public: 37 RenderLoadingProgress(); 38 ~RenderLoadingProgress() override = default; 39 40 void Update(const RefPtr<Component>& component) override; 41 SetDiameter(const Dimension & diameter)42 void SetDiameter(const Dimension& diameter) 43 { 44 // Refresh will set new diameter when window size changed. 45 if (!NearEqual(NormalizeToPx(diameter), diameter_)) { 46 diameterDimension_ = diameter; 47 if (ringController_) { 48 ringController_->Stop(); 49 ringController_->ClearStopListeners(); 50 ringController_ = nullptr; 51 } 52 if (cometController_) { 53 cometController_->Stop(); 54 cometController_->ClearStopListeners(); 55 cometController_ = nullptr; 56 } 57 usedScale_ = 0.0; 58 SetNeedLayout(true); 59 } 60 } 61 GetLoadingMode()62 int32_t GetLoadingMode() const 63 { 64 return loadingMode_; 65 } 66 GetProgressColor()67 Color GetProgressColor() const 68 { 69 return progressColor_; 70 } 71 72 void SetLoadingMode(int32_t mode); 73 74 void SetDragRange(double minDistance, double maxDistance); 75 76 void SetDragDistance(double distance); 77 78 void PerformLayout() override; 79 80 static RefPtr<RenderNode> Create(); 81 82 protected: 83 void CalculateCirclePosition(); 84 void OnVisibleChanged() override; 85 void OnHiddenChanged(bool hidden) override; 86 void AnimationChanged(); 87 88 void UpdateLoadingSize(double diameter); 89 void CalculateValue(int32_t start, int32_t end, double percent = 1.0); 90 void UpdateRingAnimation(); 91 void UpdateCometAnimation(); 92 void DoCometTailAnimation(); 93 void DoCometLoopAnimation(); 94 void UpdateCometParams(); 95 float GetCometScaleByDegree(double degree); 96 float GetCometAlphaByDegree(double degree); 97 98 Offset center_; 99 double diameter_ = 0.0; 100 Dimension diameterDimension_; 101 Dimension ringRadiusDimension_; 102 Dimension orbitRadiusDimension_; 103 RefPtr<Animator> ringController_; 104 RefPtr<Animator> cometController_; 105 106 // Prop for refresh. 107 int32_t loadingMode_ = MODE_LOOP; 108 double minDistance_ = 0.0; 109 double maxDistance_ = 0.0; 110 double curDistance_ = 0.0; 111 double dragScale_ = 1.0; // Scale effect for ring 112 double dragAlpha_ = 1.0; // Alpha effect for ring and comet 113 double exitScale_ = 1.0; // Scale effect for ring and comet when exit from refresh. 114 double exitAlpha_ = 1.0; // Alpha effect for ring and comet when exit from refresh. 115 116 double scale_ = 0.0; 117 double usedScale_ = 0.0; 118 double moveRatio_ = MOVE_RATIO; 119 double ringWidth_ = 0.0; 120 double ringRadius_ = 0.0; 121 Offset ringOffset_; 122 struct CometParam { 123 uint8_t alpha = UINT8_MAX; 124 double scale = 1.0; 125 double angular = 0.0; 126 }; 127 std::vector<CometParam> cometParams_; 128 double orbitRadius_ = 0.0; 129 double cometRadius_ = 0.0; 130 uint8_t cometAlpha_ = UINT8_MAX; 131 int32_t cometCount_ = COMET_COUNT; 132 double cometCurTail_ = 0.0; 133 double cometTailLen_ = COMET_TAIL_LEN; 134 BaseId::IdType moveStopId_ = 0; 135 BaseId::IdType tailStopId_ = 0; 136 Color progressColor_ = PROGRESS_COLOR; // When Dark: Color(0xffffffff) 137 138 // Use when Dark/night Mode. 139 double ringBgWidth_ = 0.0; 140 double ringBlurRadius_ = 0.0; 141 double ringBgBlurRadius_ = 0.0; 142 }; 143 144 } // namespace OHOS::Ace 145 146 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_RENDER_LOADING_PROGRESS_H 147