当前位置:   article > 正文

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:TabContent)_鸿蒙开发 select tabcontent

鸿蒙开发 select tabcontent

仅在Tabs中使用,对应一个切换页签的内容视图。

说明:

该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

子组件

支持单个子组件。

说明:

可内置系统组件和自定义组件,支持渲染控制类型(if/elseForEachLazyForEach)。

接口

TabContent()

属性

除支持通用属性外,还支持以下属性:

名称参数类型描述
tabBarstring | Resource |
CustomBuilder8+| {
icon?: string | Resource,
text?: string | Resource
}
设置TabBar上显示内容。
CustomBuilder: 构造器,内部可以传入组件(API8版本以上适用)。
>  说明:
> 如果icon采用svg格式图源,则要求svg图源删除其自有宽高属性值。如采用带有自有宽高属性的svg图源,icon大小则是svg本身内置的宽高属性值大小。
设置的内容超出tabbar页签时进行裁切。
tabBar9+SubTabBarStyle | BottomTabBarStyle设置TabBar上显示内容。
SubTabBarStyle: 子页签样式,参数为文字。
BottomTabBarStyle: 底部页签和侧边页签样式,参数为文字和图片。
说明:
底部样式没有下划线效果。
icon异常时显示灰色图块。

说明:

  • TabContent组件不支持设置通用宽度属性,其宽度默认撑满Tabs父组件。
  • TabContent组件不支持设置通用高度属性,其高度由Tabs父组件高度与TabBar组件高度决定。
  • vertical属性为false值,交换上述2个限制。
  • TabContent组件不支持内容过长时页面的滑动,如需页面滑动,可嵌套List使用。

SubTabBarStyle9+

子页签样式。

constructor

constructor(content: string | Resource)

SubTabBarStyle的构造函数

参数:

参数名参数类型必填参数描述
contentstring | Resource页签内的文字内容。从API version 10开始,content类型为ResourceStr。

of10+

static of(content: ResourceStr)

SubTabBarStyle的静态构造函数。

参数:

参数名参数类型必填参数描述
contentResourceStr页签内的文字内容。

属性

支持以下属性:

名称参数类型描述
indicator10+IndicatorStyle设置选中子页签的下划线风格。子页签的下划线风格仅在水平模式下有效。
selectedMode10+SelectedMode设置选中子页签的显示方式。
默认值:SelectedMode.INDICATOR
board10+BoardStyle设置选中子页签的背板风格。子页签的背板风格仅在水平模式下有效。
labelStyle10+LabelStyle设置子页签的label文本和字体的样式。
padding10+Padding | Dimension设置子页签的内边距属性(不支持百分比设置)。使用Dimension时,四个方向内边距同时生效。
默认值:{left:8.0vp,right:8.0vp,top:17.0vp,bottom:18.0vp}

IndicatorStyle10+对象说明

名称参数类型必填描述
colorResourceColor下划线的颜色和背板颜色。
默认值:#FF007DFF
heightLength下划线的高度(不支持百分比设置)。
默认值:2.0
单位:vp
widthLength下划线的宽度(不支持百分比设置)。
默认值:0.0
单位:vp
说明:
宽度设置为0时,按页签文本宽度显示。
borderRadiusLength下划线的圆角半径(不支持百分比设置)。
默认值:0.0
单位:vp
marginTopLength下划线与文字的间距(不支持百分比设置)。
默认值:8.0
单位:vp

SelectedMode10+枚举说明

名称描述
INDICATOR使用下划线模式。
BOARD使用背板模式。

BoardStyle10+对象说明

名称参数类型必填描述
borderRadiusLength背板的圆角半径(不支持百分比设置)。
默认值:8.0
单位:vp

LabelStyle10+对象说明

名称参数类型必填描述
overflowTextOverflow设置Label文本超长时的显示方式。默认值是省略号截断。
maxLinesnumber设置Label文本的最大行数。如果指定此参数,则文本最多不会超过指定的行。如果有多余的文本,可以通过textOverflow来指定截断方式。默认值是1。
minFontSizenumber | ResourceStr设置Label文本最小显示字号(不支持百分比设置)。需配合maxFontSize以及maxLines或布局大小限制使用。自适应文本大小生效后,font.size不生效。默认值是0.0fp。
maxFontSizenumber | ResourceStr设置Label文本最大显示字号(不支持百分比设置)。需配合minFontSize以及maxLines或布局大小限制使用。自适应文本大小生效后,font.size不生效。默认值是0.0fp。
heightAdaptivePolicyTextHeightAdaptivePolicy设置Label文本自适应高度的方式。默认值是最大行数优先。
fontFont设置Label文本字体样式。
当页签为子页签时,默认值是字体大小16.0fp、字体类型'HarmonyOS Sans',字体风格正常,字重正常。
当页签为底部页签时,默认值是字体大小10.0fp、字体类型'HarmonyOS Sans',字体风格正常,字重中等。

BottomTabBarStyle9+

底部页签和侧边页签样式。

constructor

constructor(icon: string | Resource, text: string | Resource)

BottomTabBarStyle的构造函数。

参数:

参数名参数类型必填参数描述
iconstring | Resource页签内的图片内容。从API version 10开始,icon类型为ResourceStr。
textstring | Resource页签内的文字内容。从API version 10开始,text类型为ResourceStr。

of10+

static of(icon: ResourceStr, text: ResourceStr) BottomTabBarStyle的静态构造函数。

参数:

参数名参数类型必填参数描述
iconResourceStr页签内的图片内容。
textResourceStr页签内的文字内容。

属性

支持以下属性:

名称参数类型描述
padding10+Padding | Dimension设置底部页签的内边距属性(不支持百分比设置)。使用Dimension时,四个方向内边距同时生效。
默认值:{left:4.0vp,right:4.0vp,top:0.0vp,bottom:0.0vp}
verticalAlign10+VerticalAlign设置底部页签的图片、文字在垂直方向上的对齐格式。
默认值:VerticalAlign.Center
layoutMode10+LayoutMode设置底部页签的图片、文字排布的方式,具体参照LayoutMode枚举。
默认值:LayoutMode.VERTICAL
symmetricExtensible10+boolean设置底部页签的图片、文字是否可以对称借左右底部页签的空余位置中的最小值,仅fixed水平模式下在底部页签之间有效。
默认值:false
labelStyle10+LabelStyle设置子页签的label文本和字体的样式。

LayoutMode10+枚举说明

名称描述
AUTO若页签宽度大于104vp,页签内容为左右排布,否则页签内容为上下排布。仅TabBar为垂直模式或Fixed水平模式时有效。
VERTICAL页签内容上下排布。
HORIZONAL页签内容左右排布。

示例

示例1

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TabContentExample {
  5. @State fontColor: string = '#182431'
  6. @State selectedFontColor: string = '#007DFF'
  7. @State currentIndex: number = 0
  8. private controller: TabsController = new TabsController()
  9. @Builder tabBuilder(index: number) {
  10. Column() {
  11. Image(this.currentIndex === index ? '/common/public_icon_on.svg' : '/common/public_icon_off.svg')
  12. .width(24)
  13. .height(24)
  14. .margin({ bottom: 4 })
  15. .objectFit(ImageFit.Contain)
  16. Text(`Tab${index + 1}`)
  17. .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)
  18. .fontSize(10)
  19. .fontWeight(500)
  20. .lineHeight(14)
  21. }.width('100%')
  22. }
  23. build() {
  24. Column() {
  25. Tabs({ barPosition: BarPosition.End, controller: this.controller }) {
  26. TabContent() {
  27. Column() {
  28. Text('Tab1')
  29. .fontSize(36)
  30. .fontColor('#182431')
  31. .fontWeight(500)
  32. .opacity(0.4)
  33. .margin({ top: 30, bottom: 56.5 })
  34. Divider()
  35. .strokeWidth(0.5)
  36. .color('#182431')
  37. .opacity(0.05)
  38. }.width('100%')
  39. }.tabBar(this.tabBuilder(0))
  40. TabContent() {
  41. Column() {
  42. Text('Tab2')
  43. .fontSize(36)
  44. .fontColor('#182431')
  45. .fontWeight(500)
  46. .opacity(0.4)
  47. .margin({ top: 30, bottom: 56.5 })
  48. Divider()
  49. .strokeWidth(0.5)
  50. .color('#182431')
  51. .opacity(0.05)
  52. }.width('100%')
  53. }.tabBar(this.tabBuilder(1))
  54. TabContent() {
  55. Column() {
  56. Text('Tab3')
  57. .fontSize(36)
  58. .fontColor('#182431')
  59. .fontWeight(500)
  60. .opacity(0.4)
  61. .margin({ top: 30, bottom: 56.5 })
  62. Divider()
  63. .strokeWidth(0.5)
  64. .color('#182431')
  65. .opacity(0.05)
  66. }.width('100%')
  67. }.tabBar(this.tabBuilder(2))
  68. TabContent() {
  69. Column() {
  70. Text('Tab4')
  71. .fontSize(36)
  72. .fontColor('#182431')
  73. .fontWeight(500)
  74. .opacity(0.4)
  75. .margin({ top: 30, bottom: 56.5 })
  76. Divider()
  77. .strokeWidth(0.5)
  78. .color('#182431')
  79. .opacity(0.05)
  80. }.width('100%')
  81. }.tabBar(this.tabBuilder(3))
  82. }
  83. .vertical(false)
  84. .barHeight(56)
  85. .onChange((index: number) => {
  86. this.currentIndex = index
  87. })
  88. .width(360)
  89. .height(190)
  90. .backgroundColor('#F1F3F5')
  91. .margin({ top: 38 })
  92. }.width('100%')
  93. }
  94. }

tabContent

示例2

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TabContentExample {
  5. @State fontColor: string = '#182431'
  6. @State selectedFontColor: string = '#007DFF'
  7. @State currentIndex: number = 0
  8. private controller: TabsController = new TabsController()
  9. @Builder tabBuilder(index: number) {
  10. Column() {
  11. Image(this.currentIndex === index ? '/common/public_icon_on.svg' : '/common/public_icon_off.svg')
  12. .width(24)
  13. .height(24)
  14. .margin({ bottom: 4 })
  15. .objectFit(ImageFit.Contain)
  16. Text('Tab')
  17. .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)
  18. .fontSize(10)
  19. .fontWeight(500)
  20. .lineHeight(14)
  21. }.width('100%').height('100%').justifyContent(FlexAlign.Center)
  22. }
  23. build() {
  24. Column() {
  25. Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {
  26. TabContent()
  27. .tabBar(this.tabBuilder(0))
  28. TabContent()
  29. .tabBar(this.tabBuilder(1))
  30. TabContent()
  31. .tabBar(this.tabBuilder(2))
  32. TabContent()
  33. .tabBar(this.tabBuilder(3))
  34. }
  35. .vertical(true)
  36. .barWidth(96)
  37. .barHeight(414)
  38. .onChange((index: number) => {
  39. this.currentIndex = index
  40. })
  41. .width(96)
  42. .height(414)
  43. .backgroundColor('#F1F3F5')
  44. .margin({ top: 52 })
  45. }.width('100%')
  46. }
  47. }

tabContent

示例3

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TabBarStyleExample {
  5. build() {
  6. Column({ space: 5 }) {
  7. Text("子页签样式")
  8. Column() {
  9. Tabs({ barPosition: BarPosition.Start }) {
  10. TabContent() {
  11. Column().width('100%').height('100%').backgroundColor(Color.Pink)
  12. }.tabBar(new SubTabBarStyle('Pink'))
  13. TabContent() {
  14. Column().width('100%').height('100%').backgroundColor(Color.Yellow)
  15. }.tabBar(new SubTabBarStyle('Yellow'))
  16. TabContent() {
  17. Column().width('100%').height('100%').backgroundColor(Color.Blue)
  18. }.tabBar(new SubTabBarStyle('Blue'))
  19. TabContent() {
  20. Column().width('100%').height('100%').backgroundColor(Color.Green)
  21. }.tabBar(new SubTabBarStyle('Green'))
  22. }
  23. .vertical(false)
  24. .scrollable(true)
  25. .barMode(BarMode.Fixed)
  26. .onChange((index: number) => {
  27. console.info(index.toString())
  28. })
  29. .width('100%')
  30. .backgroundColor(0xF1F3F5)
  31. }.width('100%').height(200)
  32. Text("底部页签样式")
  33. Column() {
  34. Tabs({ barPosition: BarPosition.End }) {
  35. TabContent() {
  36. Column().width('100%').height('100%').backgroundColor(Color.Pink)
  37. }.tabBar(new BottomTabBarStyle($r('sys.media.ohos_app_icon'), 'pink'))
  38. TabContent() {
  39. Column().width('100%').height('100%').backgroundColor(Color.Yellow)
  40. }.tabBar(new BottomTabBarStyle($r('sys.media.ohos_app_icon'), 'Yellow'))
  41. TabContent() {
  42. Column().width('100%').height('100%').backgroundColor(Color.Blue)
  43. }.tabBar(new BottomTabBarStyle($r('sys.media.ohos_app_icon'), 'Blue'))
  44. TabContent() {
  45. Column().width('100%').height('100%').backgroundColor(Color.Green)
  46. }.tabBar(new BottomTabBarStyle($r('sys.media.ohos_app_icon'), 'Green'))
  47. }
  48. .vertical(false)
  49. .scrollable(true)
  50. .barMode(BarMode.Fixed)
  51. .onChange((index: number) => {
  52. console.info(index.toString())
  53. })
  54. .width('100%')
  55. .backgroundColor(0xF1F3F5)
  56. }.width('100%').height(200)
  57. Text("侧边页签样式")
  58. Column() {
  59. Tabs({ barPosition: BarPosition.Start }) {
  60. TabContent() {
  61. Column().width('100%').height('100%').backgroundColor(Color.Pink)
  62. }.tabBar(new BottomTabBarStyle($r('sys.media.ohos_app_icon'), 'pink'))
  63. TabContent() {
  64. Column().width('100%').height('100%').backgroundColor(Color.Yellow)
  65. }.tabBar(new BottomTabBarStyle($r('sys.media.ohos_app_icon'), 'Yellow'))
  66. TabContent() {
  67. Column().width('100%').height('100%').backgroundColor(Color.Blue)
  68. }.tabBar(new BottomTabBarStyle($r('sys.media.ohos_app_icon'), 'Blue'))
  69. TabContent() {
  70. Column().width('100%').height('100%').backgroundColor(Color.Green)
  71. }.tabBar(new BottomTabBarStyle($r('sys.media.ohos_app_icon'), 'Green'))
  72. }
  73. .vertical(true).scrollable(true).barMode(BarMode.Fixed)
  74. .onChange((index: number) => {
  75. console.info(index.toString())
  76. })
  77. .width('100%')
  78. .backgroundColor(0xF1F3F5)
  79. }.width('100%').height(400)
  80. }
  81. }
  82. }

tabbarStyle

示例4

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TabsAttr {
  5. private controller: TabsController = new TabsController()
  6. @State indicatorColor: Color = Color.Blue;
  7. @State indicatorWidth: number = 40;
  8. @State indicatorHeight: number = 10;
  9. @State indicatorBorderRadius: number = 5;
  10. @State indicatorSpace: number = 10;
  11. @State subTabBorderRadius: number = 20;
  12. @State selectedMode: SelectedMode = SelectedMode.INDICATOR;
  13. private colorFlag: boolean = true;
  14. private widthFlag: boolean = true;
  15. private heightFlag: boolean = true;
  16. private borderFlag: boolean = true;
  17. private spaceFlag: boolean = true;
  18. build() {
  19. Column() {
  20. Button("下划线颜色变化").width('100%').margin({ bottom: '12vp' })
  21. .onClick((event?: ClickEvent) => {
  22. // 对Button组件的宽高属性进行动画配置
  23. if (this.colorFlag) {
  24. animateTo({
  25. duration: 1000, // 动画时长
  26. curve: Curve.Linear, // 动画曲线
  27. delay: 200, // 动画延迟
  28. iterations: 1, // 播放次数
  29. playMode: PlayMode.Normal, // 动画模式
  30. onFinish: () => {
  31. console.info('play end')
  32. }
  33. }, () => {
  34. this.indicatorColor = Color.Red
  35. })
  36. } else {
  37. animateTo({
  38. duration: 1000, // 动画时长
  39. curve: Curve.Linear, // 动画曲线
  40. delay: 200, // 动画延迟
  41. iterations: 1, // 播放次数
  42. playMode: PlayMode.Normal, // 动画模式
  43. onFinish: () => {
  44. console.info('play end')
  45. }
  46. }, () => {
  47. this.indicatorColor = Color.Yellow
  48. })
  49. }
  50. this.colorFlag = !this.colorFlag
  51. })
  52. Button("下划线高度变化").width('100%').margin({ bottom: '12vp' })
  53. .onClick((event?: ClickEvent) => {
  54. // 对Button组件的宽高属性进行动画配置
  55. if (this.heightFlag) {
  56. animateTo({
  57. duration: 1000, // 动画时长
  58. curve: Curve.Linear, // 动画曲线
  59. delay: 200, // 动画延迟
  60. iterations: 1, // 播放次数
  61. playMode: PlayMode.Normal, // 动画模式
  62. onFinish: () => {
  63. console.info('play end')
  64. }
  65. }, () => {
  66. this.indicatorHeight = 20
  67. })
  68. } else {
  69. animateTo({
  70. duration: 1000, // 动画时长
  71. curve: Curve.Linear, // 动画曲线
  72. delay: 200, // 动画延迟
  73. iterations: 1, // 播放次数
  74. playMode: PlayMode.Normal, // 动画模式
  75. onFinish: () => {
  76. console.info('play end')
  77. }
  78. }, () => {
  79. this.indicatorHeight = 10
  80. })
  81. }
  82. this.heightFlag = !this.heightFlag
  83. })
  84. Button("下划线宽度变化").width('100%').margin({ bottom: '12vp' })
  85. .onClick((event?: ClickEvent) => {
  86. // 对Button组件的宽高属性进行动画配置
  87. if (this.widthFlag) {
  88. animateTo({
  89. duration: 1000, // 动画时长
  90. curve: Curve.Linear, // 动画曲线
  91. delay: 200, // 动画延迟
  92. iterations: 1, // 播放次数
  93. playMode: PlayMode.Normal, // 动画模式
  94. onFinish: () => {
  95. console.info('play end')
  96. }
  97. }, () => {
  98. this.indicatorWidth = 30
  99. })
  100. } else {
  101. animateTo({
  102. duration: 1000, // 动画时长
  103. curve: Curve.Linear, // 动画曲线
  104. delay: 200, // 动画延迟
  105. iterations: 1, // 播放次数
  106. playMode: PlayMode.Normal, // 动画模式
  107. onFinish: () => {
  108. console.info('play end')
  109. }
  110. }, () => {
  111. this.indicatorWidth = 50
  112. })
  113. }
  114. this.widthFlag = !this.widthFlag
  115. })
  116. Button("下划线圆角半径变化").width('100%').margin({ bottom: '12vp' })
  117. .onClick((event?: ClickEvent) => {
  118. // 对Button组件的宽高属性进行动画配置
  119. if (this.borderFlag) {
  120. animateTo({
  121. duration: 1000, // 动画时长
  122. curve: Curve.Linear, // 动画曲线
  123. delay: 200, // 动画延迟
  124. iterations: 1, // 播放次数
  125. playMode: PlayMode.Normal, // 动画模式
  126. onFinish: () => {
  127. console.info('play end')
  128. }
  129. }, () => {
  130. this.indicatorBorderRadius = 0
  131. })
  132. } else {
  133. animateTo({
  134. duration: 1000, // 动画时长
  135. curve: Curve.Linear, // 动画曲线
  136. delay: 200, // 动画延迟
  137. iterations: 1, // 播放次数
  138. playMode: PlayMode.Normal, // 动画模式
  139. onFinish: () => {
  140. console.info('play end')
  141. }
  142. }, () => {
  143. this.indicatorBorderRadius = 5
  144. })
  145. }
  146. this.borderFlag = !this.borderFlag
  147. })
  148. Button("下划线间距变化").width('100%').margin({ bottom: '12vp' })
  149. .onClick((event?: ClickEvent) => {
  150. // 对Button组件的宽高属性进行动画配置
  151. if (this.spaceFlag) {
  152. animateTo({
  153. duration: 1000, // 动画时长
  154. curve: Curve.Linear, // 动画曲线
  155. delay: 200, // 动画延迟
  156. iterations: 1, // 播放次数
  157. playMode: PlayMode.Normal, // 动画模式
  158. onFinish: () => {
  159. console.info('play end')
  160. }
  161. }, () => {
  162. this.indicatorSpace = 20
  163. })
  164. } else {
  165. animateTo({
  166. duration: 1000, // 动画时长
  167. curve: Curve.Linear, // 动画曲线
  168. delay: 200, // 动画延迟
  169. iterations: 1, // 播放次数
  170. playMode: PlayMode.Normal, // 动画模式
  171. onFinish: () => {
  172. console.info('play end')
  173. }
  174. }, () => {
  175. this.indicatorSpace = 10
  176. })
  177. }
  178. this.spaceFlag = !this.spaceFlag
  179. })
  180. Tabs({ barPosition: BarPosition.End, controller: this.controller }) {
  181. TabContent() {
  182. Column().width('100%').height('100%').backgroundColor(Color.Pink).borderRadius('12vp')
  183. }.tabBar(SubTabBarStyle.of('pink')
  184. .indicator({
  185. color: this.indicatorColor, //下划线颜色
  186. height: this.indicatorHeight, //下划线高度
  187. width: this.indicatorWidth, //下划线宽度
  188. borderRadius: this.indicatorBorderRadius, //下划线圆角半径
  189. marginTop: this.indicatorSpace //下划线与文字间距
  190. })
  191. .selectedMode(this.selectedMode)
  192. .board({ borderRadius: this.subTabBorderRadius })
  193. .labelStyle({})
  194. )
  195. TabContent() {
  196. Column().width('100%').height('100%').backgroundColor(Color.Yellow).borderRadius('12vp')
  197. }.tabBar('yellow')
  198. TabContent() {
  199. Column().width('100%').height('100%').backgroundColor(Color.Blue).borderRadius('12vp')
  200. }.tabBar('blue')
  201. TabContent() {
  202. Column().width('100%').height('100%').backgroundColor(Color.Green).borderRadius('12vp')
  203. }.tabBar('green')
  204. TabContent() {
  205. Column().width('100%').height('100%').backgroundColor(Color.Gray).borderRadius('12vp')
  206. }.tabBar('gray')
  207. TabContent() {
  208. Column().width('100%').height('100%').backgroundColor(Color.Orange).borderRadius('12vp')
  209. }.tabBar('orange')
  210. }
  211. .vertical(false)
  212. .scrollable(true)
  213. .barMode(BarMode.Scrollable)
  214. .barHeight(140)
  215. .animationDuration(400)
  216. .onChange((index: number) => {
  217. console.info(index.toString())
  218. })
  219. .backgroundColor(0xF5F5F5)
  220. .height(320)
  221. }.width('100%').height(250).padding({ top: '24vp', left: '24vp', right: '24vp' })
  222. }
  223. }

tabContent3

示例5

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TabsTextOverflow {
  5. @State message: string = 'Hello World'
  6. private controller: TabsController = new TabsController()
  7. @State subTabOverflowOpaque: boolean = true;
  8. build() {
  9. Column() {
  10. Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {
  11. TabContent() {
  12. Column(){
  13. Text('单行省略号截断').fontSize(30).fontColor(0xFF000000)
  14. }.width('100%').height('100%').backgroundColor(Color.Pink)
  15. }.tabBar(SubTabBarStyle.of('开始【单行省略号截断单行省略号截断单行省略号截断单行省略号截断单行省略号截断单行省略号截断单行省略号截断单行省略号截断单行省略号截断单行省略号截断】结束')
  16. .labelStyle({ overflow: TextOverflow.Ellipsis, maxLines: 1, minFontSize: 10, heightAdaptivePolicy: TextHeightAdaptivePolicy.MAX_LINES_FIRST,
  17. font: { size: 20 } }))
  18. TabContent() {
  19. Column()
  20. {
  21. Text('先缩小再截断').fontSize(30).fontColor(0xFF000000)
  22. }.width('100%').height('100%').backgroundColor(Color.Pink)
  23. }.tabBar(SubTabBarStyle.of('开始【先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断先缩小再截断】结束')
  24. .labelStyle({ overflow: TextOverflow.Clip, maxLines: 1, minFontSize: 15, maxFontSize: 15, heightAdaptivePolicy: TextHeightAdaptivePolicy.MIN_FONT_SIZE_FIRST,
  25. font: { size: 20 } }))
  26. TabContent() {
  27. Column(){
  28. Text('先缩小再换行再截断').fontSize(30).fontColor(0xFF000000)
  29. }.width('100%').height('100%').backgroundColor(Color.Pink)
  30. }.tabBar(SubTabBarStyle.of('开始【先缩小再换行再截断先缩小再换行再截断先缩小再换行再截断先缩小再换行再截断先缩小再换行再截断先缩小再换行再截断先缩小再换行再截断先缩小再换行再截断】结束')
  31. .labelStyle({ overflow: TextOverflow.Clip, maxLines: 2, minFontSize: 15, maxFontSize: 15, heightAdaptivePolicy: TextHeightAdaptivePolicy.MIN_FONT_SIZE_FIRST,
  32. font: { size: 20 } }))
  33. TabContent() {
  34. Column() {
  35. Text('换行').fontSize(30).fontColor(0xFF000000)
  36. }
  37. .width('100%').height('100%').backgroundColor(Color.Pink)
  38. }.tabBar(SubTabBarStyle.of('开始【换行换行换行换行换行换行换行换行换行换行换行换行换行换行换行】结束')
  39. .labelStyle({ overflow: TextOverflow.Clip, maxLines: 10, minFontSize: 10, heightAdaptivePolicy: TextHeightAdaptivePolicy.MAX_LINES_FIRST,
  40. font: { size: 20 } }))
  41. }
  42. .vertical(true).scrollable(true)
  43. .barMode(BarMode.Fixed)
  44. .barHeight(720)
  45. .barWidth(200).animationDuration(400)
  46. .onChange((index: number) => {
  47. console.info(index.toString())
  48. })
  49. .height('100%').width('100%')
  50. }
  51. .height('100%')
  52. }
  53. }

tabContent4

示例6

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TabContentExample6 {
  5. private controller: TabsController = new TabsController()
  6. @State text: string = "2"
  7. @State tabPadding: number = 0;
  8. @State symmetricExtensible: boolean = false;
  9. @State layoutMode: LayoutMode = LayoutMode.VERTICAL;
  10. @State verticalAlign: VerticalAlign = VerticalAlign.Center;
  11. build() {
  12. Column() {
  13. Row() {
  14. Button("padding+10 " + this.tabPadding)
  15. .width('47%')
  16. .height(50)
  17. .margin({ top: 5 })
  18. .onClick((event?: ClickEvent) => {
  19. this.tabPadding += 10
  20. })
  21. .margin({ right: '6%', bottom: '12vp' })
  22. Button("padding-10 " + this.tabPadding)
  23. .width('47%')
  24. .height(50)
  25. .margin({ top: 5 })
  26. .onClick((event?: ClickEvent) => {
  27. this.tabPadding -= 10
  28. })
  29. .margin({ bottom: '12vp' })
  30. }
  31. Row() {
  32. Button("文本增加 ")
  33. .width('47%')
  34. .height(50)
  35. .margin({ top: 5 })
  36. .onClick((event?: ClickEvent) => {
  37. this.text += '文本增加'
  38. })
  39. .margin({ right: '6%', bottom: '12vp' })
  40. Button("文本重置")
  41. .width('47%')
  42. .height(50)
  43. .margin({ top: 5 })
  44. .onClick((event?: ClickEvent) => {
  45. this.text = "2"
  46. })
  47. .margin({ bottom: '12vp' })
  48. }
  49. Row() {
  50. Button("symmetricExtensible改变 " + this.symmetricExtensible)
  51. .width('100%')
  52. .height(50)
  53. .margin({ top: 5 })
  54. .onClick((event?: ClickEvent) => {
  55. this.symmetricExtensible = !this.symmetricExtensible
  56. })
  57. .margin({ bottom: '12vp' })
  58. }
  59. Row() {
  60. Button("layoutMode垂直 ")
  61. .width('47%')
  62. .height(50)
  63. .margin({ top: 5 })
  64. .onClick((event?: ClickEvent) => {
  65. this.layoutMode = LayoutMode.VERTICAL;
  66. })
  67. .margin({ right: '6%', bottom: '12vp' })
  68. Button("layoutMode水平 ")
  69. .width('47%')
  70. .height(50)
  71. .margin({ top: 5 })
  72. .onClick((event?: ClickEvent) => {
  73. this.layoutMode = LayoutMode.HORIZONTAL;
  74. })
  75. .margin({ bottom: '12vp' })
  76. }
  77. Row() {
  78. Button("verticalAlign朝上")
  79. .width('100%')
  80. .height(50)
  81. .margin({ top: 5 })
  82. .onClick((event?: ClickEvent) => {
  83. this.verticalAlign = VerticalAlign.Top;
  84. })
  85. .margin({ bottom: '12vp' })
  86. }
  87. Row() {
  88. Button("verticalAlign居中")
  89. .width('100%')
  90. .height(50)
  91. .margin({ top: 5 })
  92. .onClick((event?: ClickEvent) => {
  93. this.verticalAlign = VerticalAlign.Center;
  94. })
  95. .margin({ bottom: '12vp' })
  96. }
  97. Row() {
  98. Button("verticalAlign朝下")
  99. .width('100%')
  100. .height(50)
  101. .margin({ top: 5 })
  102. .onClick((event?: ClickEvent) => {
  103. this.verticalAlign = VerticalAlign.Bottom;
  104. })
  105. .margin({ bottom: '12vp' })
  106. }
  107. Tabs({ barPosition: BarPosition.End, controller: this.controller }) {
  108. TabContent() {
  109. Column().width('100%').height('100%').backgroundColor(Color.Pink)
  110. }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "1"))
  111. TabContent() {
  112. Column().width('100%').height('100%').backgroundColor(Color.Green)
  113. }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), this.text)
  114. .padding(this.tabPadding)
  115. .verticalAlign(this.verticalAlign)
  116. .layoutMode(this.layoutMode)
  117. .symmetricExtensible(this.symmetricExtensible))
  118. TabContent() {
  119. Column().width('100%').height('100%').backgroundColor(Color.Blue)
  120. }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "3"))
  121. }
  122. .animationDuration(300)
  123. .height('60%')
  124. .backgroundColor(0xf1f3f5)
  125. .barMode(BarMode.Fixed)
  126. }
  127. .width('100%')
  128. .height(500)
  129. .margin({ top: 5 })
  130. .padding('24vp')
  131. }
  132. }

tabContent4

最后,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/644079
推荐阅读
相关标签
  

闽ICP备14008679号