I. Core Style System
HarmonyOS Tabs component provides a three-tier style control system to meet diverse customization needs:
1. Basic Style Configuration
Tabs({
tabBar: {
indicator: {
color: Color.Red, // Underline color
height: 4, // Underline height
width: 80, // Underline width
borderRadius: 3 // Border radius
},
labelStyle: {
font: { size: 18, weight: FontWeight.Bold },
selectedColor: Color.Blue, // Selected text color
unselectedColor: Color.Gray // Unselected text color
}
}
})
Features:
Dynamic color binding (responsive theme switching)
Automatic underline centering
Smooth font transition animation (300ms easing)
Use Cases:
Basic navigation (Home/Category/Profile)
Quick standard style implementation
2. Navigation Bar Positioning
Property | Value | Effect | Typical Scene |
---|---|---|---|
barPosition | Start/End | Top/Bottom navigation | Main app navigation |
vertical | true/false | Vertical layout | Tablet sidebar |
Implementation:
Tabs({
barPosition: BarPosition.End,
vertical: true,
barWidth: 80, // Fixed sidebar width
barHeight: 200 // Sidebar height
})
II. Advanced Style Implementations
1. Custom Navigation Bar (Text + Icon)
@Builder
tabBarBuilder(index: number, title: string) {
Column() {
Image($r(`app.media.icon_${index}`))
.width(24)
.height(24)
.objectFit(ImageFit.Cover)
Text(title)
.fontSize(16)
.fontColor(index === currentIndex ? Color.Red : Color.Gray)
}
}
Tabs() {
TabContent() {
Text("Home Content")
}.tabBar(this.tabBarBuilder(0, "Home"))
}
Advantages:
Icon-text combination support
Visual state indication
Badge integration
Performance:
Memory increase: 15-20MB
Rendering overhead: +5-8ms/frame
2. Dynamic Gradient Effect
Tabs().onGestureSwipe((offset) => {
const ratio = offset / this.tabsWidth
this.indicatorWidth = 80 + ratio * 40 // Dynamic width
this.underlineColor = Color.interpolate(
[Color.Red, Color.Blue],
ratio
)
})
Effects:
Width transition with swipe
Smooth color interpolation (HSV/RGB)
Enhanced inertia scrolling
III. Multi-Device Adaptation
1. Device-Specific Configuration
@State isTablet: boolean = deviceType === DeviceType.TABLET
Tabs({
barPosition: this.isTablet ? BarPosition.Start : BarPosition.End,
vertical: this.isTablet,
barMode: this.isTablet ? BarMode.Scrollable : BarMode.Fixed
})
2. Screen Adaptation Matrix
Device | Position | Resolution | Special Handling |
---|---|---|---|
Phone Portrait | Bottom | 800x1200px | 4px underline height |
Phone Landscape | Top | 1200x800px | 30% padding increase |
Tablet Portrait | Left | 1600x2560px | 120px sidebar width |
Smartwatch | Circular | 396x396px | SVG icons + dynamic scaling |
IV. Performance Optimization
1. Rendering Benchmarks
Style Complexity | First Frame (ms) | Memory (MB) | FPS While Scrolling |
---|---|---|---|
Text Only | 120 | 8 | 60 |
Text + Image | 180 | 15 | 55 |
Dynamic Gradient | 220 | 18 | 48 |
2. Optimization Strategies
Virtualized Rendering: Only render visible Tabs (50% memory reduction)
Style Caching: Pre-generate common style objects (+30% rendering speed)
Animation Optimization: CSS animations over JS (+20% frame rate)
V. Implementation Patterns
1. Bottom Navigation Pattern
Tabs({
barPosition: BarPosition.End,
indicator: {
height: 4,
color: Color.Blue
}
}) {
TabContent() { Text("Home") }.tabBar("Home")
TabContent() { Text("Profile") }.tabBar("Profile")
}
2. Scrollable Tab Pattern
Tabs({
barMode: BarMode.Scrollable,
barWidth: "100%"
}) {
// Multiple TabContent components
}
Top comments (0)