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界面中创建出各种动画效果变得更加简单和直观。通过合理使用这些动画能力,开发者可以显著提升应用程序的外观和用户体验。