• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020-2021 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 /**
17  * @addtogroup UI_Components
18  * @{
19  *
20  * @brief Defines UI components such as buttons, texts, images, lists, and progress bars.
21  *
22  * @since 1.0
23  * @version 1.0
24  */
25 
26 /**
27  * @file ui_swipe_view.h
28  *
29  * @brief Defines the attributes and common functions of a swipe view.
30  *
31  * Each swipe view consists of multiple child views, which can be navigated through swiping. The child views can be
32  * either horizontal or vertical.
33  *
34  * @since 1.0
35  * @version 1.0
36  */
37 
38 #ifndef GRAPHIC_LITE_UI_SWIPE_VIEW_H
39 #define GRAPHIC_LITE_UI_SWIPE_VIEW_H
40 
41 #include "animator/animator.h"
42 #include "components/ui_abstract_scroll.h"
43 
44 namespace OHOS {
45 /**
46  * @brief Represents a swipe view.
47  *
48  * Each swipe view consists of multiple child views, which can be navigated through swiping. The child views can be
49  * either horizontal or vertical.
50  *
51  * @see UIAbstractScroll
52  * @since 1.0
53  * @version 1.0
54  */
55 class UISwipeView : public UIAbstractScroll {
56 public:
57     /**
58      * @brief Represents a listener for changes of the swipe view.
59      *
60      * This is an inner class of <b>UISwipeView</b>. It contains a callback function to be invoked when the swipe view
61      * state changes.
62      *
63      * @since 1.0
64      * @version 1.0
65      */
66     class OnSwipeListener : public HeapBase {
67     public:
68         virtual void OnSwipe(UISwipeView& view) = 0;
~OnSwipeListener()69         virtual ~OnSwipeListener() {}
70     };
71 
72     enum AlignMode : uint8_t { ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT };
73 
74     /**
75      * @brief A constructor used to create a <b>UISwipeView</b> instance.
76      *
77      * @since 1.0
78      * @version 1.0
79      */
80     UISwipeView(uint8_t direction = HORIZONTAL);
81 
82     /**
83      * @brief A destructor used to delete the <b>UISwipeView</b> instance.
84      *
85      * @since 1.0
86      * @version 1.0
87      */
88     virtual ~UISwipeView();
89 
90     /**
91      * @brief Obtains the component type.
92      *
93      * @return Returns the component type, as defined in {@link UIViewType}.
94      * @since 1.0
95      * @version 1.0
96      */
GetViewType()97     UIViewType GetViewType() const override
98     {
99         return UI_SWIPE_VIEW;
100     }
101 
102     /**
103      * @brief Sets the dragging direction.
104      *
105      * @param direction Indicates the dragging direction, either {@link HORIZONTAL} or {@link VERTICAL}.
106      * @since 1.0
107      * @version 1.0
108      */
SetDirection(uint8_t direction)109     void SetDirection(uint8_t direction)
110     {
111         direction_ = direction;
112     }
113 
114     /**
115      * @brief Obtains the dragging direction.
116      *
117      * @return Returns the dragging direction.
118      * @since 1.0
119      * @version 1.0
120      */
GetDirection()121     uint8_t GetDirection() const
122     {
123         return direction_;
124     }
125 
126     /**
127      * @brief Adds a view.
128      *
129      * @param view Indicates the view to add.
130      * @since 1.0
131      * @version 1.0
132      */
133     void Add(UIView* view) override;
134 
135     /**
136      * @brief Inserts a view.
137      *
138      * @param prevView Indicates the previous view.
139      * @param insertView Indicates the view to insert.
140      * @since 1.0
141      * @version 1.0
142      */
143     void Insert(UIView* prevView, UIView* insertView) override;
144 
145     /**
146      * @brief Deletes a view.
147      *
148      * @param view Indicates the view to delete.
149      * @since 1.0
150      * @version 1.0
151      */
152     void Remove(UIView* view) override;
153 
154     /**
155      * @brief Sets the index for the current tab.
156      *
157      * @param index Indicates the index of a view.
158      * @param needAnimator Specifies whether a flip animation is needed. <b>false</b> (default value) indicates a flip
159      * animation is not needed, and <b>true</b> indicates the opposite case.
160      * @since 1.0
161      * @version 1.0
162      */
163     void SetCurrentPage(uint16_t index, bool needAnimator = false);
164 
165     /**
166      * @brief Obtains the current tab index.
167      *
168      * @return Returns the current tab index.
169      * @since 1.0
170      * @version 1.0
171      */
GetCurrentPage()172     uint16_t GetCurrentPage() const
173     {
174         return curIndex_;
175     }
176 
177     /**
178      * @brief Obtains the current view.
179      *
180      * @return Returns the current view.
181      * @since 1.0
182      * @version 1.0
183      */
GetCurrentView()184     UIView* GetCurrentView() const
185     {
186         return curView_;
187     }
188 
189     /**
190      * @brief Sets a blank size, as defined in {@link DEFAULT_BLANK_SIZE}
191      *
192      * @param size Indicates the blank size to set.
193      * @since 1.0
194      * @version 1.0
195      */
SetBlankSize(uint16_t size)196     void SetBlankSize(uint16_t size)
197     {
198         blankSize_ = size;
199     }
200 
201     /**
202      * @fn void OnDragEvent(const DragEvent& event) override
203      *
204      * @brief revice drag event, Switch to specified view when drag
205      *
206      * @param event The drag event
207      */
208     bool OnDragEvent(const DragEvent& event) override;
209 
210     bool OnDragEndEvent(const DragEvent& event) override;
211 
212 #if ENABLE_ROTATE_INPUT
213     bool OnRotateEvent(const RotateEvent& event) override;
214 
215     bool OnRotateEndEvent(const RotateEvent& event) override;
216 #endif
217 
218     /**
219      * @brief Sets the time for the page being animated. The page will go beyond the blank during this time.
220      *
221      * @param time Indicates the time of the page being animated.
222      * @since 1.0
223      * @version 1.0
224      */
225     void SetAnimatorTime(uint16_t time);
226 
227     /**
228      * @brief Sets whether the swipe view supports a cycle swipe.
229      *
230      * @param loop Indicates the cycle swipe flag. <b>true</b> indicates the cycle swipe is supported, and <b>false</b>
231      * indicates the opposite case.
232      * @since 1.0
233      * @version 1.0
234      */
SetLoopState(bool loop)235     void SetLoopState(bool loop)
236     {
237         loop_ = loop;
238     }
239 
240     /**
241      * @brief Obtains a view based on its index.
242      *
243      * @param Indicates the index of a view.
244      * @return Returns the view.
245      * @since 1.0
246      * @version 1.0
247      */
248     UIView* GetViewByIndex(uint16_t index) const;
249 
250     /**
251      * @brief Obtains the listener set for swipe events.
252      *
253      * @return Returns the swipe event listener.
254      * @since 1.0
255      * @version 1.0
256      */
GetOnSwipeListener()257     OnSwipeListener*& GetOnSwipeListener()
258     {
259         return swipeListener_;
260     }
261 
262     /**
263      * @brief Sets the listener that contains a callback to be invoked upon a swipe event.
264      *
265      * @param onSwipeListener Indicates the listener to set.
266      * @since 1.0
267      * @version 1.0
268      */
SetOnSwipeListener(OnSwipeListener * onSwipeListener)269     void SetOnSwipeListener(OnSwipeListener* onSwipeListener)
270     {
271         swipeListener_ = onSwipeListener;
272     }
273 
274     /**
275      * @brief Sets the alignment mode for child components of <b>UISwipeView</b>.
276      *
277      * @param alignMode Indicates the alignment mode to set, as enumerated in {@link AlignMode}.
278      * The default value is <b>ALIGN_CENTER</b>.
279      * @since 1.0
280      * @version 1.0
281      */
282     void SetAlignMode(AlignMode alignMode = ALIGN_CENTER)
283     {
284         alignMode_ = alignMode;
285     }
286 
287     /**
288      * @brief Obtains the alignment mode of child components of <b>UISwipeView</b>.
289      *
290      * @return Returns the alignment mode. For details, see {@link AlignMode}.
291      * @since 1.0
292      * @version 1.0
293      */
GetAlignMode()294     AlignMode GetAlignMode()
295     {
296         return alignMode_;
297     }
298 
299     /**
300      * @brief Indicates the horizontal direction.
301      *
302      * @since 1.0
303      * @version 1.0
304      */
305     static constexpr uint8_t HORIZONTAL = 0;
306 
307     /**
308      * @brief Indicates the vertical direction.
309      *
310      * @since 1.0
311      * @version 1.0
312      */
313     static constexpr uint8_t VERTICAL = 1;
314 
315     void SetXScrollBarVisible(bool visible) = delete;
316 
317     void SetYScrollBarVisible(bool visible) = delete;
318 
319     void SetScrollBarSide(uint8_t side) = delete;
320 
321     void SetScrollBarCenter(Point center) = delete;
322 
323 protected:
324     bool DragXInner(int16_t distance) override;
325     bool DragYInner(int16_t distance) override;
326     void SortChild();
327     void StopAnimator() override;
328     virtual void SwitchToPage(int16_t dst, bool needAnimator = true);
329     void MoveChildByOffset(int16_t xOffset, int16_t yOffset) override;
330     void MoveHeadOrTailChild();
331 
332     /**
333      * @brief Indicates that the animation duration is 12 ticks.
334      *
335      * @since 1.0
336      * @version 1.0
337      */
338     constexpr static uint16_t ANIMATOR_TIME = 12;
339 
340     /**
341      * @brief Indicates the maximum distance of an invalid dragging. Dragging is not triggered if the distance is less
342      * than this value.
343      *
344      * @since 1.0
345      * @version 1.0
346      */
347     constexpr static uint16_t STOP_DISTANCE = 5;
348 
349     /**
350      * @brief Indicates the maximum distance between the first and the last tab when the current view is not in a cycle
351      * swipe mode. The page can be rebound after the setting.
352      *
353      * @since 1.0
354      * @version 1.0
355      */
356     constexpr static uint16_t DEFAULT_BLANK_SIZE = 30;
357     uint16_t tickTime_;
358     OnSwipeListener* swipeListener_;
359     uint16_t curIndex_;
360     uint16_t blankSize_;
361     UIView* curView_;
362     AlignMode alignMode_ = ALIGN_CENTER;
363     bool loop_;
364 
365 private:
366     void RefreshCurrentViewByPosition(int16_t (UIView::*pfnGetXOrY)() const, int16_t (UIView::*pfnGetWidthOrHeight)());
367     void RefreshCurrentViewByThrow(int16_t distance,
368                                    uint8_t dragDirection,
369                                    int16_t (UIView::*pfnGetXOrY)() const,
370                                    int16_t (UIView::*pfnGetWidthOrHeight)());
371 
372     bool IsNeedLoop();
373     void MoveFirstChildToLast();
374     void MoveLastChildToFirst();
375     void CalculateInvalidate();
376     void CurrentIndexInc();
377     void CurrentIndexDec();
378     void Vibrator();
379 };
380 } // namespace OHOS
381 #endif // GRAPHIC_LITE_UI_SWIPE_VIEW_H
382