ArkTS-一次开发,多端部署

展示在这里插入图片描述在这里插入图片描述

在这里插入图片描述

官方代码适配解读

官方代码:一次开发,多端部署-视频应用

解读

  1. 适配多端:根据屏幕大小来判断不同客户端,BreakpointSystem.ets中引入官方API获取 @ohos.mediaquery
  2. CommonConstants.ets定义好不同屏幕范围大小,供需要判断处使用
  3. BreakpointSystem.ets中根据不同的屏幕大小,设置不同的监听器,为监听器绑定注册和销毁回调事件
  4. 将当前屏幕应设置的栅格设置保存在AppStorage中的currentBreakpoint,供所需判断处使用
  5. MainPage.ets主页面中引入BreakpointSystem,在页面开启时aboutToAppear注册,在页面关闭时aboutToDisappear销毁
  6. MainPage.ets主页面通过.showSideBar(this.currentBreakpoint === Const.LG)判断是否显示侧边栏,通过 if (this.currentBreakpoint !== Const.LG) { BottomTabs({ bottomTabIndex: $bottomTabIndex }) }判断是否显示底边导航,实现导航的底部或者侧边显示,以实现多端适配

BreakpointSystem.ets代码

import mediaQuery from '@ohos.mediaquery';
import { CommonConstants as Const } from '../constants/CommonConstants';export class BreakpointSystem {private currentBreakpoint: string = Const.MD;private smListener: mediaQuery.MediaQueryListener = mediaQuery.matchMediaSync(Const.BREAKPOINTS_SCOPE_1);private mdListener: mediaQuery.MediaQueryListener = mediaQuery.matchMediaSync(Const.BREAKPOINTS_SCOPE_2);private lgListener: mediaQuery.MediaQueryListener = mediaQuery.matchMediaSync(Const.BREAKPOINTS_SCOPE_3);private updateCurrentBreakpoint(breakpoint: string) {if (this.currentBreakpoint !== breakpoint) {this.currentBreakpoint = breakpoint;AppStorage.Set<string>('currentBreakpoint', this.currentBreakpoint);}}private isBreakpointSM = (mediaQueryResult: mediaQuery.MediaQueryResult) => {if (mediaQueryResult.matches) {this.updateCurrentBreakpoint(Const.SM);}}private isBreakpointMD = (mediaQueryResult: mediaQuery.MediaQueryResult) => {if (mediaQueryResult.matches) {this.updateCurrentBreakpoint(Const.MD);}}private isBreakpointLG = (mediaQueryResult: mediaQuery.MediaQueryResult) => {if (mediaQueryResult.matches) {this.updateCurrentBreakpoint(Const.LG);}}public register() {this.smListener = mediaQuery.matchMediaSync(Const.BREAKPOINTS_SCOPE_1);this.smListener.on('change', this.isBreakpointSM);this.mdListener = mediaQuery.matchMediaSync(Const.BREAKPOINTS_SCOPE_2);this.mdListener.on('change', this.isBreakpointMD);this.lgListener = mediaQuery.matchMediaSync(Const.BREAKPOINTS_SCOPE_3);this.lgListener.on('change', this.isBreakpointLG);}public unregister() {this.smListener.off('change', this.isBreakpointSM);this.mdListener.off('change', this.isBreakpointMD);this.lgListener.off('change', this.isBreakpointLG);}
}

CommonConstants.ets关键代码片段

 /*** Breakpoints that represent small device types.*/static readonly SM: string = 'sm';/*** Breakpoints that represent middle device types.*/static readonly MD: string = 'md';/*** Breakpoints that represent large device types.*/static readonly LG: string = 'lg';/*** Range of the small device width.*/static readonly BREAKPOINTS_SCOPE_1: string = '(320vp<=width<520vp)';/*** Range of the middle device width.*/static readonly BREAKPOINTS_SCOPE_2: string = '(520vp<=width<840vp)';/*** Range of the large device width.*/static readonly BREAKPOINTS_SCOPE_3: string = '(840vp<=width)';

MainPage.ets代码

import { BreakpointSystem, CommonConstants as Const } from '@ohos/common';
import { BottomTabs } from '../view/BottomTabsComponent';
import { LeftTabs } from '../view/LeftTabsComponent';
import { HomeTabs } from '../view/HomeTabsComponent';
import { FindTabs } from '../view/FindTabsComponent';
import { DriveTabs } from '../view/DriveTabsComponent';
import { MineTabs } from '../view/MineTabsComponent';@Entry
@Component
struct MainPage {@State @Watch('onIndexChange') bottomTabIndex: number = 0;@StorageProp('currentBreakpoint') currentBreakpoint: string = Const.MD;private breakpointSystem: BreakpointSystem = new BreakpointSystem();private controller: TabsController = new TabsController();aboutToAppear() {this.breakpointSystem.register();}aboutToDisappear() {this.breakpointSystem.unregister();}onIndexChange() {this.controller.changeIndex(this.bottomTabIndex);}build() {SideBarContainer(SideBarContainerType.Embed) {LeftTabs({ bottomTabIndex: $bottomTabIndex });Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.End, justifyContent: FlexAlign.End }) {Tabs({ barPosition: BarPosition.End, index: 0, controller: this.controller }) {TabContent() {HomeTabs({ currentBreakpoint: $currentBreakpoint })}.padding({left: this.currentBreakpoint === Const.SM ? $r('app.float.main_page_padding1') : (this.currentBreakpoint === Const.MD ? $r('app.float.main_page_padding3') : 0),right: this.currentBreakpoint === Const.SM ? $r('app.float.main_page_padding1') : $r('app.float.main_page_padding3')})TabContent() {FindTabs()}.padding({left: this.currentBreakpoint === Const.SM ? $r('app.float.main_page_padding2') : (this.currentBreakpoint === Const.MD ? $r('app.float.main_page_padding3') : 0),right: this.currentBreakpoint === Const.SM ? $r('app.float.main_page_padding2') : $r('app.float.main_page_padding3')})TabContent() {DriveTabs()}.padding({left: this.currentBreakpoint === Const.SM ? $r('app.float.main_page_padding1') : (this.currentBreakpoint === Const.MD ? $r('app.float.main_page_padding3') : 0),right: this.currentBreakpoint === Const.SM ? $r('app.float.main_page_padding1') : $r('app.float.main_page_padding3')})TabContent() {MineTabs()}}.onChange((index: number) => {this.bottomTabIndex = index;}).width(Const.FULL_SIZE).vertical(false).barHeight(0)if (this.currentBreakpoint !== Const.LG) {BottomTabs({ bottomTabIndex: $bottomTabIndex })}}.width(Const.FULL_SIZE).backgroundColor($r('app.color.background_color'))}.showSideBar(this.currentBreakpoint === Const.LG).showControlButton(false).sideBarWidth(Const.SIDEBAR_WIDTH).maxSideBarWidth(Const.SIDEBAR_WIDTH_MAX).minSideBarWidth(Const.SIDEBAR_WIDTH_MIN)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283903.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】map和set的模拟实现

map和set的模拟实现 插入模拟实现正向迭代器模拟实现插入完整实现map的[ ]接口模拟实现正向迭代器完整代码反向迭代器模拟实现 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 在前面几篇C的博客&#xff0c;讲过了二叉搜索树&#xff0c;AVL树&#xff0c;红黑…

生物识别银行行业分析:预测2025年市场规模将达到930.5亿元

据不完全统计&#xff0c;多家银行曾申请多模态生物识别技术相关专利。虽然部分专利被驳回或撤回&#xff0c;仍可体现银行在多模态生物识别技术上的探索。 生物识别银行专利提供一种基于人脸和语音双重识别的转账方法。包括&#xff1a;第一用户的客户端获取第二用户的生物特征…

http跟https的区别

只要上过网的朋友一定接触过“HTTP”&#xff0c;每次开网页的时候&#xff0c;不管是什么网址&#xff0c;其前面都会出现HTTP字样&#xff0c;比如 “http&#xff1a;55049sjad.com”、“http&#xff1a;544.65.5.6.com”等等&#xff0c;而有些时候打开如银行等对安全性要…

堆与二叉树(上)

本篇主要讲的是一些概念&#xff0c;推论和堆的实现&#xff08;核心在堆的实现这一块&#xff09; 涉及到的一些结论&#xff0c;证明放到最后&#xff0c;可以选择跳过&#xff0c;知识点过多&#xff0c;当复习一用差不多&#xff0c;如果是刚学这一块的&#xff0c;建议打…

R语言——基本操作(一)

目录 一、基本操作 二、R包的安装及使用 三、获取帮助 四、内置数据集 五、数据结构 六、向量索引 七、向量运算 参考 Rstudio 控制台常用快捷键 Ctrl ↑ &#xff1a;查看所有历史记录&#xff0c;比直接使用 ↑ 查找更方便 Esc&#xff1a;中断操作&#xff0c;可中…

【网络安全】-Linux操作系统—VMWare软件

文章目录 VMWare软件的安装选择VMWare版本下载VMWare安装过程 VMWare的常用操作创建新的虚拟机配置虚拟机启动和关闭虚拟机安装VMWare Tools VMWare的克隆和快照克隆&#xff08;Clone&#xff09;快照&#xff08;Snapshot&#xff09; 总结 VMWare是一种流行的虚拟化软件&…

【C语言】操作符详解(四):结构成员访问操作符

目录 结构成员访问操作符 结构体 结构体的声明 结构体变量的定义和初始化 结构成员访问操作符 结构体成员的直接访问 结构体成员的间接访问 结构成员访问操作符 结构体 ⭐C语言已经提供了内置类型&#xff0c;如: char、short、int、long、float、double等&#xff0c;但…

Java刷题篇——单链表练习题上

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例2 输入&#xff1a;head [1,2] 输出&…

零经验外贸SOHO怎么做?海洋建站的教程?

如何从零开始做外贸SOHO&#xff1f;新人小白做外贸网站的技巧&#xff1f; 零经验外贸SOHO&#xff0c;似乎是一条充满未知和挑战的道路。对于没有外贸经验的人来说&#xff0c;想要进入外贸行业确实比较困难。但是&#xff0c;只要你有决心和努力&#xff0c;零经验也可以做…

直播种类之语音直播

语音直播是一种通过语音传输的直播形式&#xff0c;用户可以通过语音与主播或其他观众进行实时交流和互动。 在语音直播中&#xff0c;主播可以通过语音聊天、唱歌、讲故事等多种形式与观众进行互动。观众也可以通过语音连麦等方式与主播进行实时交流。 相对于视频直播&#…

[原创][R语言]股票分析实战[2]:周级别涨幅趋势的相关性

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

JavaOOP篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、标识符的命名规则二、instanceof关键字的作用三、什么是隐式转换&#xff0c;什么是显式转换 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…