1、代码
pages新建Home.ets
// 计算排列方式
import { BreakPointType, BreakpointSystem } from '../common/BreakpointSystem'
import { HomeIndex } from './HomeComponents/Index'
import { MyIndex } from './HomeComponents/MyIndex'
@Entry
@Component
struct Home {
@State currentTabIndex: number = 0
@StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm'
private breakpointSystem: BreakpointSystem = new BreakpointSystem()
aboutToAppear() {
this.breakpointSystem.register()
}
aboutToDisappear() {
this.breakpointSystem.unregister()
}
@Builder
// 下方每个tabs的样式
bottomBarItemBuilder(name: string, icon: Resource, index: number) {
Flex({
direction: new BreakPointType({
sm: FlexDirection.Column,
md: FlexDirection.Row,
lg: FlexDirection.Column
}).getValue(this.currentBreakpoint),
justifyContent: FlexAlign.Center,
alignItems: ItemAlign.Center
}) {
Image(icon)
.height(24)
.width(24)
.fillColor(this.getTabBarColor(index))
Text(name)
.margin(new BreakPointType<Padding>({
sm: { top: 4 },
md: { left: 8 },
lg: { top: 4 }
}).getValue(this.currentBreakpoint) as Padding)
.fontSize(11)
.fontColor(this.getTabBarColor(index))
}
}
build() {
Tabs({
barPosition: new BreakPointType({ // 计算排列方式
sm: BarPosition.End,
md: BarPosition.End,
lg: BarPosition.Start
}).getValue(this.currentBreakpoint)
}) {
TabContent() {
// 不写判断的话 HomeIndex和MyIndex里面的生命周期aboutToAppear都会执行 会导致一次掉很多的接口
if (this.currentTabIndex === 0) {
HomeIndex()
}
}.tabBar(this.bottomBarItemBuilder('首页', $r("app.media.ic_bottom_home"), 0))
TabContent() {
if (this.currentTabIndex === 1) {
MyIndex()
}
}.tabBar(this.bottomBarItemBuilder('我的', $r("app.media.ic_bottom_record"), 1))
}
.vertical(new BreakPointType({ sm: false, md: false, lg: true }).getValue(this.currentBreakpoint) as boolean)
.barWidth(new BreakPointType({ sm: '100%', md: '100%', lg: '56vp' }).getValue(this.currentBreakpoint) as string)
.barHeight(new BreakPointType({ sm: '56vp', md: '56vp', lg: '60%' }).getValue(this.currentBreakpoint) as string)
.animationDuration(0)
.onChange((index) => {
this.currentTabIndex = index
})
}
private getTabBarColor(index: number) {
return this.currentTabIndex == index ? '#73CD57' : '#999999';
}
}
ets下新建common文件夹 创建BreakpointSystem.ets文件
import mediaQuery from '@ohos.mediaquery'
declare interface BreakPointTypeOption<T> {
xs?: T
sm?: T
md?: T
lg?: T
xl?: T
xxl?: T
}
export class BreakPointType<T> {
options: BreakPointTypeOption<T>
constructor(option: BreakPointTypeOption<T>) {
this.options = option
}
getValue(currentBreakPoint: string) {
if (currentBreakPoint === 'xs') {
return this.options.xs
} else if (currentBreakPoint === 'sm') {
return this.options.sm
} else if (currentBreakPoint === 'md') {
return this.options.md
} else if (currentBreakPoint === 'lg') {
return this.options.lg
} else if (currentBreakPoint === 'xl') {
return this.options.xl
} else if (currentBreakPoint === 'xxl') {
return this.options.xxl
} else {
return undefined
}
}
}
class Breakpoint {
name: string = '';
size: number = 0;
mediaQueryListener?: mediaQuery.MediaQueryListener
}
export class BreakpointSystem {
private currentBreakpoint: string = 'md'
private breakpoints: Breakpoint[] = [{ name: 'xs', size: 0 }, { name: 'sm', size: 320 },
{ name: 'md', size: 520 }, { name: 'lg', size: 840 }]
private updateCurrentBreakpoint(breakpoint: string) {
if (this.currentBreakpoint !== breakpoint) {
this.currentBreakpoint = breakpoint
AppStorage.Set<string>('currentBreakpoint', this.currentBreakpoint)
console.log('on current breakpoint: ' + this.currentBreakpoint)
}
}
public register() {
this.breakpoints.forEach((breakpoint: Breakpoint, index) => {
let condition: string = ''
if (index === this.breakpoints.length - 1) {
condition = "(" + breakpoint.size + "vp<=width" + ")"
} else {
condition = "(" + breakpoint.size + "vp<=width<" + this.breakpoints[index + 1].size + "vp)"
}
console.log(condition)
breakpoint.mediaQueryListener = mediaQuery.matchMediaSync(condition)
breakpoint.mediaQueryListener.on('change', (mediaQueryResult) => {
if (mediaQueryResult.matches) {
this.updateCurrentBreakpoint(breakpoint.name)
}
})
})
}
public unregister() {
this.breakpoints.forEach((breakpoint: Breakpoint) => {
if (breakpoint.mediaQueryListener) {
breakpoint.mediaQueryListener.off('change')
}
})
}
}
2、效果
上一章: HarmonyOS发送请求-优快云博客