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