03-UI组件介绍和实际应用(中)

本文将继续为您讲解 ArkUI 框架中的常用组件和动画功能,包括文本组件、切换组件、滑动条组件以及动画组件。 通过清晰的概念讲解和实战示例,帮助初学者快速掌握这些功能的用法,并在实际开发中灵活运用。

1、文本组件

文本组件 是用于显示一段文本的基础组件,同时支持丰富的样式和布局配置,还可以包含 Span、ImageSpan 等子组件。

1.1 文本组件的定义与属性

接口:
1    Text(content?: string | Resource, options?: TextOptions)

属性说明:

  • content:显示的文本内容。

  • 样式设置:可以通过 .style() 方法为文本指定对齐方式、字体大小、边框、填充等样式。

1.2 使用示例

content:要显示的文本内容,一个简单的例子如下:

 1        // xxx.ets
 2        @Extend(Text)
 3        function style(TextAlign: TextAlign) {
 4        .textAlign(TextAlign)
 5        .fontSize(12)
 6        .border({ width: 1 })
 7        .padding(10)
 8        .width('100%')
 9        }
10
11        @Entry
12        @Component
13        struct TextExample1 {
14        build() {
15            Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) {
16            // 文本水平方向对齐方式设置
17            // 单行文本
18            Text('textAlign').fontSize(9).fontColor(0xCCCCCC)
19            Text('TextAlign set to Center.')
20                .style(TextAlign.Center)
21            Text('TextAlign set to Start.')
22                .style(TextAlign.Start)
23            Text('TextAlign set to End.')
24                .style(TextAlign.End)
25
26            // 多行文本
27            Text('This is the text content with textAlign set to Center.')
28                .style(TextAlign.Center)
29            Text('This is the text content with textAlign set to Start.')
30                .style(TextAlign.Start)
31            Text('This is the text content with textAlign set to End.')
32                .style(TextAlign.End)
33
34
35            // 文本超长时显示方式
36            Text('TextOverflow+maxLines').fontSize(9).fontColor(0xCCCCCC)
37            // 超出maxLines截断内容展示
38            Text('This is the setting of textOverflow to Clip text content This is the setting of textOverflow to None text content. This is the setting of textOverflow to Clip text content This is the setting of textOverflow to None text content.')
39                .textOverflow({ overflow: TextOverflow.Clip })
40                .maxLines(1)
41                .style(TextAlign.Start)
42
43            // 超出maxLines展示省略号
44            Text('This is set textOverflow to Ellipsis text content This is set textOverflow to Ellipsis text content.')
45                .textOverflow({ overflow: TextOverflow.Ellipsis })
46                .maxLines(1)
47                .style(TextAlign.Start)
48
49            Text('lineHeight').fontSize(9).fontColor(0xCCCCCC)
50            Text('This is the text with the line height set. This is the text with the line height set.')
51                .style(TextAlign.Start)
52            Text('This is the text with the line height set. This is the text with the line height set.')
53                .style(TextAlign.Start)
54                .lineHeight(20)
55                }.height(600).width(340).padding({ left: 35, right: 35, top: 35 })
56            }
57        }

2、Toggle组件

组件提供勾选框样式、状态按钮样式及开关样式。仅当ToggleType为Button时可包含子组件。

2.1 定义与参数

1    Toggle(options: { type: ToggleType, isOn?: boolean })

参数说明:

  • type:切换类型,如 Switch(开关)、Checkbox(复选框)、Button(按钮)。

  • isOn:当前状态(true 或 false)。

2.2 使用实例

一个简单的例子如下:
 1        // xxx.ets
 2        @Entry
 3        @Component
 4        struct ToggleExample {
 5        build() {
 6            Column({ space: 10 }) {
 7            Text('type: Switch').fontSize(12).fontColor(0xcccccc).width('90%')
 8            Flex({ justifyContent: FlexAlign.SpaceEvenly, alignItems: ItemAlign.Center }) {
 9                Toggle({ type: ToggleType.Switch, isOn: false })
10                .selectedColor('#007DFF')
11                .switchPointColor('#FFFFFF')
12                .onChange((isOn: boolean) => {
13                    console.info('Component status:' + isOn)
14                })
15
16                Toggle({ type: ToggleType.Switch, isOn: true })
17                .selectedColor('#007DFF')
18                .switchPointColor('#FFFFFF')
19                .onChange((isOn: boolean) => {
20                    console.info('Component status:' + isOn)
21                })
22            }
23
24            Text('type: Checkbox').fontSize(12).fontColor(0xcccccc).width('90%')
25            Flex({ justifyContent: FlexAlign.SpaceEvenly, alignItems: ItemAlign.Center }) {
26                Toggle({ type: ToggleType.Checkbox, isOn: false })
27                .size({ width: 20, height: 20 })
28                .selectedColor('#007DFF')
29                .onChange((isOn: boolean) => {
30                    console.info('Component status:' + isOn)
31                })
32
33                Toggle({ type: ToggleType.Checkbox, isOn: true })
34                .size({ width: 20, height: 20 })
35                .selectedColor('#007DFF')
36                .onChange((isOn: boolean) => {
37                    console.info('Component status:' + isOn)
38                })
39            }
40
41            Text('type: Button').fontSize(12).fontColor(0xcccccc).width('90%')
42            Flex({ justifyContent: FlexAlign.SpaceEvenly, alignItems: ItemAlign.Center }) {
43                Toggle({ type: ToggleType.Button, isOn: false }) {
44                Text('status button').fontColor('#182431').fontSize(12)
45                }.width(106)
46                .selectedColor('rgba(0,125,255,0.20)')
47                .onChange((isOn: boolean) => {
48                console.info('Component status:' + isOn)
49                })
50
51                Toggle({ type: ToggleType.Button, isOn: true }) {
52                Text('status button').fontColor('#182431').fontSize(12)
53                }.width(106)
54                .selectedColor('rgba(0,125,255,0.20)')
55                .onChange((isOn: boolean) => {
56                console.info('Component status:' + isOn)
57                })
58              }
59            }.width('100%').padding(24)
60         }
61        }

3、滑动条组件

滑动条组件,通常用于快速调节设置值,如音量调节、亮度调节等应用场景。

3.1 定义与参数

接口:
1        Slider(options?: SliderOptions)

参数说明:

  • value:当前滑动值(支持双向绑定)。

  • min / max:滑动条的最小值和最大值。

  • step:滑动步长。

  • 样式:支持 OutSet(外置样式)和 InSet(内嵌样式)。

3.2 使用示例

  1        // xxx.ets
  2        @Entry
  3        @Component
  4        struct SliderExample {
  5        @State outSetValueOne: number = 40
  6        @State inSetValueOne: number = 40
  7        @State noneValueOne: number = 40
  8        @State outSetValueTwo: number = 40
  9        @State inSetValueTwo: number = 40
 10        @State vOutSetValueOne: number = 40
 11        @State vInSetValueOne: number = 40
 12        @State vOutSetValueTwo: number = 40
 13        @State vInSetValueTwo: number = 40
 14
 15        build() {
 16            Column({ space: 8 }) {
 17            Text('outset slider').fontSize(9).fontColor(0xCCCCCC).width('90%').margin(15)
 18            Row() {
 19                Slider({
 20                value: this.outSetValueOne,
 21                min: 0,
 22                max: 100,
 23                style: SliderStyle.OutSet
 24                })
 25                .showTips(true)
 26                .onChange((value: number, mode: SliderChangeMode) => {
 27                    this.outSetValueOne = value
 28                    console.info('value:' + value + 'mode:' + mode.toString())
 29                })
 30                // toFixed(0)将滑动条返回值处理为整数精度
 31                Text(this.outSetValueOne.toFixed(0)).fontSize(12)
 32            }
 33            .width('80%')
 34            Row() {
 35                Slider({
 36                value: this.outSetValueTwo,
 37                step: 10,
 38                style: SliderStyle.OutSet
 39                })
 40                .showSteps(true)
 41                .onChange((value: number, mode: SliderChangeMode) => {
 42                    this.outSetValueTwo = value
 43                    console.info('value:' + value + 'mode:' + mode.toString())
 44                })
 45                Text(this.outSetValueTwo.toFixed(0)).fontSize(12)
 46            }
 47            .width('80%')
 48
 49            Text('inset slider').fontSize(9).fontColor(0xCCCCCC).width('90%').margin(15)
 50            Row() {
 51                Slider({
 52                value: this.inSetValueOne,
 53                min: 0,
 54                max: 100,
 55                style: SliderStyle.InSet
 56                })
 57                .blockColor('#191970')
 58                .trackColor('#ADD8E6')
 59                .selectedColor('#4169E1')
 60                .showTips(true)
 61                .onChange((value: number, mode: SliderChangeMode) => {
 62                    this.inSetValueOne = value
 63                    console.info('value:' + value + 'mode:' + mode.toString())
 64                })
 65                Text(this.inSetValueOne.toFixed(0)).fontSize(12)
 66            }
 67            .width('80%')
 68            Row() {
 69                Slider({
 70                value: this.inSetValueTwo,
 71                step: 10,
 72                style: SliderStyle.InSet
 73                })
 74                .blockColor('#191970')
 75                .trackColor('#ADD8E6')
 76                .selectedColor('#4169E1')
 77                .showSteps(true)
 78                .onChange((value: number, mode: SliderChangeMode) => {
 79                    this.inSetValueTwo = value
 80                    console.info('value:' + value + 'mode:' + mode.toString())
 81                })
 82                Text(this.inSetValueTwo.toFixed(0)).fontSize(12)
 83            }
 84            .width('80%')
 85
 86            Text('none slider').fontSize(9).fontColor(0xCCCCCC).width('90%').margin(15)
 87            Row() {
 88                Slider({
 89                value: this.noneValueOne,
 90                min: 0,
 91                max: 100,
 92                style: SliderStyle.NONE
 93                })
 94                .blockColor('#191970')
 95                .trackColor('#ADD8E6')
 96                .selectedColor('#4169E1')
 97                .showTips(true)
 98                .onChange((value: number, mode: SliderChangeMode) => {
 99                    this.noneValueOne = value
100                    console.info('value:' + value + 'mode:' + mode.toString())
101                })
102                Text(this.noneValueOne.toFixed(0)).fontSize(12)
103            }
104            .width('80%')
105
106            Row() {
107                Column() {
108                Text('vertical outset slider').fontSize(9).fontColor(0xCCCCCC).width('50%').margin(15)
109                Row() {
110                    Text().width('10%')
111                    Slider({
112                    value: this.vOutSetValueOne,
113                    style: SliderStyle.OutSet,
114                    direction: Axis.Vertical
115                    })
116                    .blockColor('#191970')
117                    .trackColor('#ADD8E6')
118                    .selectedColor('#4169E1')
119                    .showTips(true)
120                    .onChange((value: number, mode: SliderChangeMode) => {
121                        this.vOutSetValueOne = value
122                        console.info('value:' + value + 'mode:' + mode.toString())
123                    })
124                    Slider({
125                    value: this.vOutSetValueTwo,
126                    step: 10,
127                    style: SliderStyle.OutSet,
128                    direction: Axis.Vertical
129                    })
130                    .blockColor('#191970')
131                    .trackColor('#ADD8E6')
132                    .selectedColor('#4169E1')
133                    .showSteps(true)
134                    .onChange((value: number, mode: SliderChangeMode) => {
135                        this.vOutSetValueTwo = value
136                        console.info('value:' + value + 'mode:' + mode.toString())
137                    })
138                }
139                }.width('50%').height(300)
140
141                Column() {
142                Text('vertical inset slider').fontSize(9).fontColor(0xCCCCCC).width('50%').margin(15)
143                Row() {
144                    Slider({
145                    value: this.vInSetValueOne,
146                    style: SliderStyle.InSet,
147                    direction: Axis.Vertical,
148                    reverse: true // 竖向的Slider默认是上端是min值,下端是max值,因此想要从下往上滑动,需要设置reverse为true
149                    })
150                    .showTips(true)
151                    .onChange((value: number, mode: SliderChangeMode) => {
152                        this.vInSetValueOne = value
153                        console.info('value:' + value + 'mode:' + mode.toString())
154                    })
155                    Slider({
156                    value: this.vInSetValueTwo,
157                    step: 10,
158                    style: SliderStyle.InSet,
159                    direction: Axis.Vertical,
160                    reverse: true
161                    })
162                    .showSteps(true)
163                    .onChange((value: number, mode: SliderChangeMode) => {
164                        this.vInSetValueTwo = value
165                        console.info('value:' + value + 'mode:' + mode.toString())
166                    })
167                }
168                }.width('50%').height(300)
169            }
170            }.width('100%')
171        }
172        }

4、动画组件

在现代UI界面设计中,动画扮演着举足轻重的角色。它不仅能够提升界面的直观性,还能显著改善应用程序的外观和用户体验。ArkUI开发框架深知动画的重要性,为开发者提供了丰富的动画能力,如属性动画、转场动画及自定义动画等。 接下来,本文将详细介绍这些动画类型,并通过实战演示如何在ArkUI中使用它们。 4.1、动画介绍 ---------------- 4.1.1、属性动画 ---------------- 属性动画允许开发者对UI元素的属性(如位置、大小、颜色等)进行动态改变,从而创建出丰富的动画效果。在ArkUI中,属性动画可以通过设置动画属性、持续时间、延迟时间等参数来定制。

4.1.2、转场动画

转场动画主要用于页面之间的切换效果。它能够使界面在切换时更加流畅,提升用户体验。ArkUI提供了多种转场动画效果,如淡入淡出、滑动等,开发者可以根据实际需求选择合适的动画效果。

4.1.3、自定义动画

除了属性动画和转场动画外,ArkUI还支持自定义动画。开发者可以通过编写代码来定义自己的动画效果,实现更加复杂和个性化的动画需求。

4.2、实战演示

接下来,我们将通过实战演示如何在ArkUI中使用这些动画能力。

4.2.1、属性动画实战

假设我们有一个按钮元素,想要在用户点击按钮时改变其颜色。我们可以使用属性动画来实现这一效果。 首先,我们需要创建一个按钮元素,并为其添加点击事件监听器。然后,在点击事件触发时,我们使用属性动画来改变按钮的颜色。

 1    // 创建按钮元素
 2    Button button = new Button();
 3    button.setText("点击我");
 4
 5    // 添加点击事件监听器
 6    button.setOnClickedListener(() -> {
 7        // 使用属性动画改变按钮颜色
 8        Animation animation = new Animation();
 9        animation.setProperty("backgroundColor", Color.RED, Color.BLUE);
10        animation.setDuration(1000); // 设置动画持续时间
11        animation.start(button); // 启动动画
12    });

4.2.2、转场动画实战

假设我们有两个页面,想要在用户点击按钮时切换到另一个页面,并添加淡入淡出的转场动画效果。 首先,我们需要创建两个页面元素,并为其添加按钮和点击事件监听器。然后,在点击事件触发时,我们使用转场动画来实现页面切换。

 1    // 创建两个页面元素
 2    Page page1 = new Page();
 3    Page page2 = new Page();
 4
 5    // 添加按钮和点击事件监听器到page1
 6    Button button = new Button();
 7    button.setText("切换到页面2");
 8    page1.add(button);
 9
10    button.setOnClickedListener(() -> {
11        // 使用转场动画切换到page2
12        Transition transition = new Transition();
13        transition.setType(TransitionType.FADE_IN_FADE_OUT); // 设置淡入淡出效果
14        transition.start(page1, page2); // 启动转场动画
15    });

4.2.3、自定义动画实战

假设我们想要创建一个自定义的动画效果,如让一个元素沿着特定路径移动。 首先,我们需要定义一个动画路径。然后,我们使用自定义动画来实现元素沿着该路径移动的效果。

 1    // 创建动画路径
 2    Path path = new Path();
 3    path.moveTo(0, 0);
 4    path.lineTo(100, 100);
 5
 6    // 创建自定义动画
 7    CustomAnimation customAnimation = new CustomAnimation(path);
 8    customAnimation.setDuration(2000); // 设置动画持续时间
 9
10    // 获取要移动的元素并应用动画
11    Element element = ...; // 假设已经有一个元素
12    customAnimation.start(element); // 启动自定义动画

需要注意的是,以上代码示例仅用于演示如何在ArkUI中使用动画能力,并非完整的可运行代码。在实际开发中,开发者需要根据自己的需求来创建UI元素、设置动画参数等。 综上所述,ArkUI为开发者提供了丰富的动画能力,使得在UI界面中创建出各种动画效果变得更加简单和直观。通过合理使用这些动画能力,开发者可以显著提升应用程序的外观和用户体验。