
回复
在鸿蒙开发中,断点适配是实现「一套代码跑多端」的关键。本文解析断点核心概念与实战技巧,助你打造适配手机/平板/车机的弹性布局~
断点名称 | 宽度范围(vp) | 典型设备 |
---|---|---|
XS | [0, 320) | 折叠屏(折叠状态) |
sm | [320, 600) | 手机 |
md | [600, 840) | 平板 |
lg | [840, +∞) | 大屏/车机 |
graph TD
A[窗口尺寸变化] --> B[触发断点切换]
B --> C[更新UI布局]
C --> D[组件重渲染]
GridRow({
breakpoints: {
value: ['600vp', '840vp'], // 定义断点阈值
reference: BreakpointsReference.WindowSize
}
}) {
GridCol({
span: {
xs: 12, // 小屏占满
sm: 6, // 中屏占1/2
md: 4, // 大屏占1/3
lg: 3 // 超大屏占1/4
}
}) {
// 组件内容
}
}
@Entry
@Component
struct ImageWall {
build() {
GridRow() {
// 小屏单列,大屏多列
GridCol({ span: { sm: 12, md: 6, lg: 4 } }) {
Image('').width('100%').aspectRatio(1)
Text('图片描述').center()
}
// 重复组件实现网格效果
}
.columnsTemplate('1fr 1fr') // 大屏两列
.rowsTemplate('1fr 1fr')
.gap(10)
}
}
@Entry
@Component
struct AdaptiveNav {
@State isLargeScreen: boolean = false
build() {
Navigation() {
if (isLargeScreen) {
// 大屏分栏导航
Row() {
Column() { /* 侧边栏 */ }
Column() { /* 内容区 */ }
}
} else {
// 小屏底部导航
BottomNavigation() { /* 底部标签 */ }
}
}
.onBreakpointChange((bp) => {
isLargeScreen = bp >= '600vp'
})
}
}
onBreakpointChange
中更新状态@Entry
@Component
struct DynamicLayout {
@State showSideBar: boolean = false
build() {
Row() {
if (showSideBar) {
Column() { /* 侧边栏内容 */ }
.width('25%')
}
Column() { /* 主内容区 */ }
.flexGrow(1)
}
.onBreakpointChange((bp) => {
showSideBar = bp >= '600vp' // 大屏始终显示侧边栏
})
}
}
md
和lg
使用相同布局)@Builder
组件适配不同断点LazyForEach
)