1 /* 2 * Copyright (c) 2023 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_NG_PATTERNS_LOADING_PROGRESS_LOADING_PROGRESS_UTILLL_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LOADING_PROGRESS_LOADING_PROGRESS_UTILLL_H 18 19 #include "base/geometry/dimension.h" 20 #include "base/utils/utils.h" 21 #include "core/components_ng/pattern/loading_progress/loading_progress_base.h" 22 namespace OHOS::Ace::NG { 23 namespace { 24 constexpr int32_t DEFAULT_INDEX = 3; 25 constexpr uint32_t SIZE = 6; 26 const Dimension RING_STROKE_WIDTH[] = { 1.12_vp, 1.5_vp, 1.76_vp, 1.9_vp, 2.16_vp, 2.28_vp }; 27 const Dimension COMET_RADIUS[] = { 1.2_vp, 1.8_vp, 2.4_vp, 3.0_vp, 3.36_vp, 4.18_vp }; 28 const Dimension DIAMETER[] = { 16.0_vp, 24.0_vp, 32.0_vp, 40.0_vp, 48.0_vp, 76.0_vp}; 29 const float RING_DARK_RADIUS_16VP = 0.5f; 30 const float RING_DARK_RADIUS_40VP = 0.2f; 31 const float RING_DARK_RADIUS_76VP = 0.1f; 32 const float RING_DARK_BACKGROUND_WIDTH_40VP = 3.0f; 33 const float RING_DARK_BACKGROUND_WIDTH_76VP = 2.0f; 34 const float RING_DARK_BACKGROUND_RADIUS = 2.0f; 35 const Dimension MODE_16 = 16.0_vp; 36 const Dimension MODE_24 = 24.0_vp; 37 const Dimension MODE_32 = 32.0_vp; 38 const Dimension MODE_40 = 40.0_vp; 39 const Dimension MODE_48 = 48.0_vp; 40 const Dimension MODE_76 = 76.0_vp; 41 42 constexpr Dimension RING_RADIUS_BASE40 = 10.5_vp; 43 constexpr Dimension ORBIT_RADIUS_BASE40 = 17.0_vp; 44 } // namespace 45 class LoadingProgressUtill { 46 public: 47 LoadingProgressUtill() = default; 48 ~LoadingProgressUtill() = default; 49 GetRingRadius(float diameter)50 static float GetRingRadius(float diameter) 51 { 52 return RING_RADIUS_BASE40.ConvertToPx() * diameter / MODE_40.ConvertToPx(); 53 } 54 GetOrbitRadius(float diameter)55 static float GetOrbitRadius(float diameter) 56 { 57 return ORBIT_RADIUS_BASE40.ConvertToPx() * diameter / MODE_40.ConvertToPx(); 58 } 59 GetRingStrokeWidth(float diameter)60 static float GetRingStrokeWidth(float diameter) 61 { 62 if (LessOrEqual(diameter, MODE_16.ConvertToPx())) { 63 return diameter / MODE_16.ConvertToPx() * RING_STROKE_WIDTH[0].ConvertToPx(); 64 } else if (GreatOrEqual(diameter, MODE_76.ConvertToPx())) { 65 return GetMostStrokeWidth(diameter); 66 } else { 67 for (uint32_t index = 1; index < SIZE; index++) { 68 if (LessOrEqual(diameter, DIAMETER[index].ConvertToPx())) { 69 return CalculateValue(diameter, DIAMETER[index - 1].ConvertToPx(), DIAMETER[index].ConvertToPx(), 70 RING_STROKE_WIDTH[index - 1].ConvertToPx(), RING_STROKE_WIDTH[index].ConvertToPx()); 71 } 72 } 73 } 74 return RING_STROKE_WIDTH[DEFAULT_INDEX].ConvertToPx(); 75 } 76 GetRingDarkRadius(float diameter)77 static float GetRingDarkRadius(float diameter) 78 { 79 if (LessOrEqual(diameter, MODE_16.ConvertToPx())) { 80 return Dimension(RING_DARK_RADIUS_16VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP) 81 .ConvertToPx(); 82 } else if (GreatOrEqual(diameter, MODE_76.ConvertToPx())) { 83 return Dimension(RING_DARK_RADIUS_76VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP) 84 .ConvertToPx(); 85 } else { 86 return Dimension(RING_DARK_RADIUS_40VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP) 87 .ConvertToPx(); 88 } 89 } 90 GetRingDarkBackgroundWidth(float diameter)91 static float GetRingDarkBackgroundWidth(float diameter) 92 { 93 if (LessOrEqual(diameter, MODE_40.ConvertToPx())) { 94 return Dimension(RING_DARK_BACKGROUND_WIDTH_40VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP) 95 .ConvertToPx(); 96 } else { 97 return Dimension(RING_DARK_BACKGROUND_WIDTH_76VP * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP) 98 .ConvertToPx(); 99 } 100 } 101 GetRingDarkBackgroundRadius(float diameter)102 static float GetRingDarkBackgroundRadius(float diameter) 103 { 104 return Dimension(RING_DARK_BACKGROUND_RADIUS * (diameter / MODE_40.ConvertToPx()), DimensionUnit::VP) 105 .ConvertToPx(); 106 } 107 GetCometRadius(float diameter)108 static float GetCometRadius(float diameter) 109 { 110 if (LessOrEqual(diameter, MODE_16.ConvertToPx())) { 111 return diameter / MODE_16.ConvertToPx() * COMET_RADIUS[0].ConvertToPx(); 112 } else if (GreatOrEqual(diameter, MODE_76.ConvertToPx())) { 113 return GetMostCometRadius(diameter); 114 } else { 115 for (uint32_t index = 1; index < SIZE; index++) { 116 if (LessOrEqual(diameter, DIAMETER[index].ConvertToPx())) { 117 return CalculateValue(diameter, DIAMETER[index - 1].ConvertToPx(), DIAMETER[index].ConvertToPx(), 118 COMET_RADIUS[index - 1].ConvertToPx(), COMET_RADIUS[index].ConvertToPx()); 119 } 120 } 121 } 122 return COMET_RADIUS[DEFAULT_INDEX].ConvertToPx(); 123 } 124 GetMostStrokeWidth(float diameter)125 static float GetMostStrokeWidth(float diameter) 126 { 127 auto index_76 = static_cast<uint32_t>(LoadingProgressBase::BASE76); 128 auto strokeWidth_76 = 129 RING_STROKE_WIDTH[index_76].ConvertToPx() / (MODE_76.ConvertToPx() / MODE_40.ConvertToPx()); 130 return strokeWidth_76 * (diameter / MODE_40.ConvertToPx()); 131 } 132 GetMostCometRadius(float diameter)133 static float GetMostCometRadius(float diameter) 134 { 135 auto index_76 = static_cast<uint32_t>(LoadingProgressBase::BASE76); 136 auto cometRadius_76 = COMET_RADIUS[index_76].ConvertToPx() / (MODE_76.ConvertToPx() / MODE_40.ConvertToPx()); 137 return cometRadius_76 * (diameter / MODE_40.ConvertToPx()); 138 } 139 140 private: CalculateValue(float inputValue,float minInput,float maxInput,float minOutPut,float maxOutput)141 static float CalculateValue(float inputValue, float minInput, float maxInput, float minOutPut, float maxOutput) 142 { 143 auto inputScale = (inputValue - minInput) / (maxInput - minInput); 144 return (maxOutput - minOutPut) * inputScale + minOutPut; 145 } 146 }; 147 } // namespace OHOS::Ace::NG 148 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LOADING_PROGRESS_LOADING_PROGRESS_UTILLL_H 149