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 Dimension MODE_16 = 16.0_vp; 30 const Dimension MODE_24 = 24.0_vp; 31 const Dimension MODE_32 = 32.0_vp; 32 const Dimension MODE_40 = 40.0_vp; 33 const Dimension MODE_48 = 48.0_vp; 34 const Dimension MODE_76 = 76.0_vp; 35 36 constexpr Dimension RING_RADIUS_BASE40 = 10.5_vp; 37 constexpr Dimension ORBIT_RADIUS_BASE40 = 17.0_vp; 38 } // namespace 39 class LoadingProgressUtill { 40 public: 41 LoadingProgressUtill() = default; 42 ~LoadingProgressUtill() = default; 43 GetRingRadius(float diameter)44 static float GetRingRadius(float diameter) 45 { 46 return RING_RADIUS_BASE40.ConvertToPx() * diameter / MODE_40.ConvertToPx(); 47 } 48 GetOrbitRadius(float diameter)49 static float GetOrbitRadius(float diameter) 50 { 51 return ORBIT_RADIUS_BASE40.ConvertToPx() * diameter / MODE_40.ConvertToPx(); 52 } 53 GetRingStrokeWidth(float diameter)54 static float GetRingStrokeWidth(float diameter) 55 { 56 if (LessOrEqual(diameter, MODE_16.ConvertToPx())) { 57 return diameter / MODE_16.ConvertToPx() * RING_STROKE_WIDTH[0].ConvertToPx(); 58 } else if (GreatOrEqual(diameter, MODE_76.ConvertToPx())) { 59 return GetMostStrokeWidth(diameter); 60 } else { 61 for (uint32_t index = 1; index < SIZE; index++) { 62 if (LessOrEqual(diameter, DIAMETER[index].ConvertToPx())) { 63 return CalculateValue(diameter, DIAMETER[index - 1].ConvertToPx(), DIAMETER[index].ConvertToPx(), 64 RING_STROKE_WIDTH[index - 1].ConvertToPx(), RING_STROKE_WIDTH[index].ConvertToPx()); 65 } 66 } 67 } 68 return RING_STROKE_WIDTH[DEFAULT_INDEX].ConvertToPx(); 69 } 70 GetCometRadius(float diameter)71 static float GetCometRadius(float diameter) 72 { 73 if (LessOrEqual(diameter, MODE_16.ConvertToPx())) { 74 return diameter / MODE_16.ConvertToPx() * COMET_RADIUS[0].ConvertToPx(); 75 } else if (GreatOrEqual(diameter, MODE_76.ConvertToPx())) { 76 return GetMostCometRadius(diameter); 77 } else { 78 for (uint32_t index = 1; index < SIZE; index++) { 79 if (LessOrEqual(diameter, DIAMETER[index].ConvertToPx())) { 80 return CalculateValue(diameter, DIAMETER[index - 1].ConvertToPx(), DIAMETER[index].ConvertToPx(), 81 COMET_RADIUS[index - 1].ConvertToPx(), COMET_RADIUS[index].ConvertToPx()); 82 } 83 } 84 } 85 return COMET_RADIUS[DEFAULT_INDEX].ConvertToPx(); 86 } 87 GetMostStrokeWidth(float diameter)88 static float GetMostStrokeWidth(float diameter) 89 { 90 auto index_76 = static_cast<uint32_t>(LoadingProgressBase::BASE76); 91 auto strokeWidth_76 = 92 RING_STROKE_WIDTH[index_76].ConvertToPx() / (MODE_76.ConvertToPx() / MODE_40.ConvertToPx()); 93 return strokeWidth_76 * (diameter / MODE_40.ConvertToPx()); 94 } 95 GetMostCometRadius(float diameter)96 static float GetMostCometRadius(float diameter) 97 { 98 auto index_76 = static_cast<uint32_t>(LoadingProgressBase::BASE76); 99 auto cometRadius_76 = COMET_RADIUS[index_76].ConvertToPx() / (MODE_76.ConvertToPx() / MODE_40.ConvertToPx()); 100 return cometRadius_76 * (diameter / MODE_40.ConvertToPx()); 101 } 102 103 private: CalculateValue(float inputValue,float minInput,float maxInput,float minOutPut,float maxOutput)104 static float CalculateValue(float inputValue, float minInput, float maxInput, float minOutPut, float maxOutput) 105 { 106 auto inputScale = (inputValue - minInput) / (maxInput - minInput); 107 return (maxOutput - minOutPut) * inputScale + minOutPut; 108 } 109 }; 110 } // namespace OHOS::Ace::NG 111 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LOADING_PROGRESS_LOADING_PROGRESS_UTILLL_H 112