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 #include "ui_test_view_percent.h"
17
18 #include <cstdio>
19 #include <cstdlib>
20 #include <string>
21 #include "common/screen.h"
22 #include "components/ui_label.h"
23 #include "components/ui_label_button.h"
24 #include "layout/grid_layout.h"
25
26 namespace OHOS {
27 namespace {
28 static int16_t g_widthPercent = 100;
29 const uint16_t LABEL_HEIGHT = 60;
30 const uint16_t DEFAULT_WIDITH = 80;
31 const uint16_t DEFAULT_HEIGHT = 60;
32 const uint16_t DEFAULT_ELEMENT_COUNT = 10;
33 const uint16_t DEFAULT_PERCENT = 10;
34 const uint16_t MAX_PERCENT = 100;
35 const float DEFAULT_PERCENT_INTERVAL = 100.0f;
36 const int16_t TEXT_H = 20;
37 const int16_t GAP = 10;
38 static int16_t g_view1WidthPercent = DEFAULT_PERCENT;
39 static int16_t g_view1HeightPercent = DEFAULT_PERCENT;
40 static int16_t g_view2WidthPercent = DEFAULT_PERCENT;
41 static int16_t g_view2HeightPercent = DEFAULT_PERCENT;
42 }
43
SetUp()44 void UITestViewPercent::SetUp()
45 {
46 if (container_ == nullptr) {
47 InitContainer();
48 }
49 viewGroup = new UIViewGroup();
50 view1_ = new UIButton();
51 view2_ = new UIView();
52 view3_ = new UIView();
53 resetfBtn_ = new UILabelButton();
54 BiggerBtn_ = new UILabelButton();
55 SmallerBtn_ = new UILabelButton();
56 positionX_ = 20; // default start x-coordinate as 20
57 positionY_ = 5; // default start y-coordinate as 5
58 }
59
TearDown()60 void UITestViewPercent::TearDown()
61 {
62 DeleteChildren(container_);
63 container_ = nullptr;
64 }
65
GetTestView()66 const UIView* UITestViewPercent::GetTestView()
67 {
68 InitView();
69 return container_;
70 }
71
InitContainer()72 void UITestViewPercent::InitContainer()
73 {
74 container_ = new UIScrollView();
75 container_->SetThrowDrag(true);
76 container_->SetHorizontalScrollState(false);
77 container_->Resize(Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight() - BACK_BUTTON_HEIGHT);
78 }
79
InitView()80 void UITestViewPercent::InitView()
81 {
82 if (container_ == nullptr) {
83 InitContainer();
84 }
85
86 UILabel* label = new UILabel();
87 container_->Add(label);
88 positionY_ = TEXT_DISTANCE_TO_TOP_SIDE;
89 label->SetPosition(TEXT_DISTANCE_TO_LEFT_SIDE, positionY_,
90 Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);
91 label->SetText("Flex布局效果 ");
92 label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
93 positionY_ += (TEXT_H + GAP);
94
95 flexLayout_ = new FlexLayout();
96 container_->Add(flexLayout_);
97 InitFlexLayout();
98 positionY_ += flexLayout_->GetHeight() + GAP;
99
100 InitViewGroup();
101 positionY_ += viewGroup->GetHeight() + GAP;
102
103 GridLayout* gridLayout = new GridLayout();
104 container_->Add(gridLayout);
105 gridLayout->Resize(260, 60); // 260: width; 60: height
106 gridLayout->SetLayoutDirection(LAYOUT_HOR);
107 gridLayout->SetPosition(0, positionY_); // 260: width; 60: height
108 // 2: half of screen width; 2: half of gridLayout
109 gridLayout->LayoutLeftOfParent(Screen::GetInstance().GetWidth() / 2 - gridLayout->GetWidth() / 2);
110 gridLayout->SetRows(1); // set gridlayout row as 1
111 gridLayout->SetCols(3); // set gridlayout column as 3
112
113 SetUpButton(*gridLayout, *resetfBtn_, "reset", UI_TEST_RESET);
114 SetUpButton(*gridLayout, *BiggerBtn_, "Bigger", UI_TEST_BIGGER);
115 SetUpButton(*gridLayout, *SmallerBtn_, "Smaller", UI_TEST_SMALLER);
116 gridLayout->LayoutChildren(true);
117 container_->LayoutChildren(true);
118 }
119
InitFlexLayout()120 void UITestViewPercent::InitFlexLayout()
121 {
122 positionY_ = VIEW_DISTANCE_TO_TOP_SIDE;
123 flexLayout_->SetPosition(VIEW_DISTANCE_TO_LEFT_SIDE, positionY_);
124 flexLayout_->SetWidthPercent(0.9f); // set default width percent as 0.9
125 flexLayout_->SetHeightPercent(0.9f); // set default height percent as 0.9
126 flexLayout_->SetStyle(STYLE_BORDER_COLOR, Color::White().full);
127 flexLayout_->SetStyle(STYLE_BORDER_OPA, HALF_OPA_OPAQUE);
128 flexLayout_->SetStyle(STYLE_BORDER_WIDTH, VIEW_STYLE_BORDER_WIDTH);
129 flexLayout_->SetStyle(STYLE_BORDER_RADIUS, VIEW_STYLE_BORDER_RADIUS);
130 flexLayout_->SetStyle(STYLE_BACKGROUND_OPA, 0);
131 for (int16_t i = 1; i <= DEFAULT_ELEMENT_COUNT; i++) {
132 AddElement(i);
133 }
134 flexLayout_->SetFlexWrap(1);
135 flexLayout_->SetLayoutDirection(LAYOUT_HOR);
136 flexLayout_->SetMajorAxisAlign(ALIGN_START);
137 flexLayout_->SetSecondaryAxisAlign(ALIGN_CENTER);
138 flexLayout_->LayoutChildren();
139 }
140
InitViewGroup() const141 void UITestViewPercent::InitViewGroup() const
142 {
143 container_->Add(viewGroup);
144 viewGroup->SetPosition(VIEW_DISTANCE_TO_LEFT_SIDE, positionY_);
145 viewGroup->SetWidthPercent(0.9f); // set default width percent as 0.9
146 viewGroup->SetHeight(viewGroup->GetParent()->GetHeight());
147 viewGroup->SetStyle(STYLE_BORDER_COLOR, Color::White().full);
148 viewGroup->SetStyle(STYLE_BORDER_OPA, HALF_OPA_OPAQUE);
149 viewGroup->SetStyle(STYLE_BORDER_WIDTH, VIEW_STYLE_BORDER_WIDTH);
150 viewGroup->SetStyle(STYLE_BORDER_RADIUS, VIEW_STYLE_BORDER_RADIUS);
151 viewGroup->SetStyle(STYLE_BACKGROUND_OPA, 0);
152 viewGroup->Add(view1_);
153 view1_->SetViewId("view1");
154 view1_->SetPositionPercent(0.1, 0.1); // set view1 position percent x-percent=0.1, y-percent=0.1
155 view1_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);
156 view1_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
157 view1_->SetStyle(STYLE_BORDER_COLOR, Color::Black().full);
158 view1_->SetStyle(STYLE_BORDER_OPA, OPA_OPAQUE);
159 view1_->SetStyle(STYLE_BORDER_WIDTH, 1); // set border width 1
160 view1_->SetStyle(STYLE_BORDER_RADIUS, 5); // set border radius 5
161 view1_->SetHeightPercent(g_view1WidthPercent / DEFAULT_PERCENT_INTERVAL);
162 view1_->SetWidthPercent(g_view1HeightPercent / DEFAULT_PERCENT_INTERVAL);
163
164 viewGroup->Add(view2_);
165 view2_->SetViewId("view2");
166 view2_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
167 view2_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
168 view2_->SetStyle(STYLE_BORDER_COLOR, Color::Blue().full);
169 view2_->SetStyle(STYLE_BORDER_OPA, OPA_OPAQUE);
170 view2_->SetStyle(STYLE_BORDER_WIDTH, 1); // set border width 1
171 view2_->SetStyle(STYLE_BORDER_RADIUS, 5); // set border radius 5
172 view2_->SetPositionPercent(
173 0.3, 0.1, /* set view2 position percent x-percent=0.3, y-percent=0.1 */
174 g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL, g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
175
176 viewGroup->Add(view3_);
177 view3_->SetViewId("view3");
178 view3_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);
179 view3_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
180 view3_->SetStyle(STYLE_BORDER_COLOR, Color::Red().full);
181 view3_->SetStyle(STYLE_BORDER_OPA, OPA_OPAQUE);
182 view3_->SetStyle(STYLE_BORDER_WIDTH, 1); // set border width 1
183 view3_->SetStyle(STYLE_BORDER_RADIUS, 5); // set border radius 5
184 view3_->SetXPercent(0.5); // set view3 x-percent=0.5
185 view3_->SetYPercent(0.1); // set view3 , y-percent=0.1
186 view3_->SetWidthPercent(g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL);
187 view3_->SetHeightPercent(g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
188 }
189
AddElement(int16_t index)190 void UITestViewPercent::AddElement(int16_t index)
191 {
192 if (flexLayout_ == nullptr) {
193 InitView();
194 }
195
196 UILabel* label = new UILabel();
197 flexLayout_->Add(label);
198 float percent = DEFAULT_PERCENT / DEFAULT_PERCENT_INTERVAL;
199 label->SetWidthPercent(percent);
200 label->SetHeightPercent(percent);
201 label->SetText(std::to_string(index).c_str());
202 label->SetFont("HYQiHei-65S.otf", 20); // set default font size as 20
203 label->SetStyle(STYLE_TEXT_COLOR, Color::Black().full);
204 label->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
205 label->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
206 label->SetStyle(STYLE_BORDER_COLOR, Color::Black().full);
207 label->SetStyle(STYLE_BORDER_OPA, OPA_OPAQUE);
208 label->SetStyle(STYLE_BORDER_WIDTH, 1); // set border width 1
209 label->SetStyle(STYLE_BORDER_RADIUS, 5); // set border radius 5
210 label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
211 }
212
OnClick(UIView & view,const ClickEvent & event)213 bool UITestViewPercent::OnClick(UIView& view, const ClickEvent& event)
214 {
215 if (&view == resetfBtn_) {
216 g_view1HeightPercent = DEFAULT_PERCENT;
217 g_view1WidthPercent = DEFAULT_PERCENT;
218 g_view2HeightPercent = DEFAULT_PERCENT;
219 g_view2WidthPercent = DEFAULT_PERCENT;
220 view1_->ResizePercent(g_view1WidthPercent / DEFAULT_PERCENT_INTERVAL,
221 g_view1HeightPercent / DEFAULT_PERCENT_INTERVAL);
222 view2_->ResizePercent(g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL,
223 g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
224 g_widthPercent = DEFAULT_PERCENT;
225 flexLayout_->SetWidthPercent(g_widthPercent / DEFAULT_PERCENT_INTERVAL);
226 } else if (&view == BiggerBtn_) {
227 if (g_widthPercent < DEFAULT_PERCENT) {
228 g_widthPercent++;
229 flexLayout_->SetWidthPercent(g_widthPercent / DEFAULT_PERCENT_INTERVAL);
230 }
231 g_view1HeightPercent++;
232 g_view1WidthPercent++;
233 g_view2HeightPercent++;
234 g_view2WidthPercent++;
235 view1_->ResizePercent(g_view1WidthPercent / DEFAULT_PERCENT_INTERVAL,
236 g_view1HeightPercent / DEFAULT_PERCENT_INTERVAL);
237 view2_->ResizePercent(g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL,
238 g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
239 } else if (&view == SmallerBtn_) {
240 g_view1HeightPercent--;
241 g_view1WidthPercent--;
242 g_view2HeightPercent--;
243 g_view2WidthPercent--;
244 view1_->ResizePercent(g_view1WidthPercent / DEFAULT_PERCENT_INTERVAL,
245 g_view1HeightPercent / DEFAULT_PERCENT_INTERVAL);
246 view2_->ResizePercent(g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL,
247 g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
248 flexLayout_->SetWidthPercent((g_widthPercent--) / DEFAULT_PERCENT_INTERVAL);
249 }
250 view2_->GetParent()->Invalidate();
251 return true;
252 }
253 }
254
255