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_SCROLL_SCROLL_EDGE_EFFECT_BASE_NG_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_SCROLL_SCROLL_EDGE_EFFECT_BASE_NG_H 18 19 #include <functional> 20 21 #include "base/memory/ace_type.h" 22 #include "core/components/common/layout/constants.h" 23 #include "core/components/common/properties/color.h" 24 #include "core/components_ng/pattern/scrollable/scrollable.h" 25 26 namespace OHOS::Ace::NG { 27 28 using EdgeCallback = std::function<double()>; 29 30 class ScrollEdgeEffectBase : public AceType { 31 DECLARE_ACE_TYPE(ScrollEdgeEffectBase, AceType); 32 33 public: ScrollEdgeEffectBase(EdgeEffect edgeEffect)34 explicit ScrollEdgeEffectBase(EdgeEffect edgeEffect) : edgeEffect_(edgeEffect) {} 35 ScrollEdgeEffectBase()36 ScrollEdgeEffectBase() : edgeEffect_(EdgeEffect::SPRING) {} 37 ~ScrollEdgeEffectBase()38 ~ScrollEdgeEffectBase() override 39 { 40 scrollable_ = nullptr; 41 } 42 GetEdgeEffect()43 EdgeEffect GetEdgeEffect() const 44 { 45 return edgeEffect_; 46 } 47 48 // support layout out of boundary fill with blank IsRestrictBoundary()49 bool IsRestrictBoundary() const 50 { 51 return edgeEffect_ != EdgeEffect::SPRING; 52 } 53 IsFadeEffect()54 bool IsFadeEffect() const 55 { 56 return edgeEffect_ == EdgeEffect::FADE; 57 } 58 IsNoneEffect()59 bool IsNoneEffect() const 60 { 61 return edgeEffect_ == EdgeEffect::NONE; 62 } 63 IsSpringEffect()64 bool IsSpringEffect() const 65 { 66 return edgeEffect_ == EdgeEffect::SPRING; 67 } 68 SetScrollable(const RefPtr<Scrollable> & scrollable)69 void SetScrollable(const RefPtr<Scrollable>& scrollable) 70 { 71 scrollable_ = scrollable; 72 } 73 SetCurrentPositionCallback(const EdgeCallback & currentPositionCallback)74 void SetCurrentPositionCallback(const EdgeCallback& currentPositionCallback) 75 { 76 currentPositionCallback_ = currentPositionCallback; 77 } 78 SetLeadingCallback(const EdgeCallback & leadingCallback)79 void SetLeadingCallback(const EdgeCallback& leadingCallback) 80 { 81 leadingCallback_ = leadingCallback; 82 } 83 SetTrailingCallback(const EdgeCallback & trainingCallback)84 void SetTrailingCallback(const EdgeCallback& trainingCallback) 85 { 86 trailingCallback_ = trainingCallback; 87 } 88 SetInitLeadingCallback(const EdgeCallback & initLeadingCallback)89 void SetInitLeadingCallback(const EdgeCallback& initLeadingCallback) 90 { 91 initLeadingCallback_ = initLeadingCallback; 92 } 93 SetInitTrailingCallback(const EdgeCallback & initTrainingCallback)94 void SetInitTrailingCallback(const EdgeCallback& initTrainingCallback) 95 { 96 initTrailingCallback_ = initTrainingCallback; 97 } 98 99 // common use InitialEdgeEffect()100 virtual void InitialEdgeEffect() {} 101 102 // fade effect use CalculateOverScroll(double oldPosition,bool isReachMax)103 virtual double CalculateOverScroll(double oldPosition, bool isReachMax) 104 { 105 return 0.0; 106 } 107 108 // spring effect use RegisterSpringCallback()109 virtual void RegisterSpringCallback() {} 110 ProcessScrollOver(double velocity)111 virtual void ProcessScrollOver(double velocity) {} ProcessSpringUpdate()112 virtual void ProcessSpringUpdate() {} 113 protected: 114 RefPtr<Scrollable> scrollable_; 115 EdgeCallback currentPositionCallback_; // get current position 116 EdgeCallback leadingCallback_; // get stable min extent 117 EdgeCallback trailingCallback_; // get stable max extent 118 EdgeCallback initLeadingCallback_; // get current min extent 119 EdgeCallback initTrailingCallback_; // get current max extent 120 private: 121 EdgeEffect edgeEffect_; 122 }; 123 124 } // namespace OHOS::Ace 125 126 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_SCROLL_SCROLL_EDGE_EFFECT_BASE_NG_H