鸿蒙开发进阶:一次开发多端部署之Breakpoint原理探秘

16 篇文章 0 订阅
12 篇文章 0 订阅

使用

引入Breakpoint
import { BreakpointSystem } from '../common/BreakpointSystem';
实例化Breakpoint声明静态属性breakpointSystem,使用StorageProp获取全局设定的currentBreakpoint,值一般是‘sm’、‘md’、‘lg’,该属性为响应式可在DOM结构中使用
private breakpointSystem: BreakpointSystem = new BreakpointSystem();
@StorageProp('currentBreakpoint') curBp: string = Constants.BREAKPOINTS[1];
监听函数注册与解绑
aboutToAppear() {
  this.breakpointSystem.register();
}
aboutToDisappear() {
  this.breakpointSystem.unregister();
}

原理

声明断点arkts类型

import { mediaquery } from "@kit.ArkUI";
import Constants from './Constants';

interface Breakpoint {
  name: string,
  size: number,
  mediaQueryListener?: mediaquery.MediaQueryListener
}

Breakpoint

export class BreakpointSystem {
  private currentBreakpoint: string = Constants.BREAKPOINTS[1];
  private breakpoints: Breakpoint[] = [
    { name: 'sm', size: 320 },
    { name: 'md', size: 600 },
    { name: 'lg', size: 840 }
  ];

  private updateCurrentBreakpoint(breakpoint: string) {
    if (this.currentBreakpoint !== breakpoint) {
      this.currentBreakpoint = breakpoint;
      AppStorage.setOrCreate<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)';
      }
      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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值