经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » 鸿蒙 » 查看文章
鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
来源:cnblogs  作者:蜀道山QAQ  时间:2024/3/29 14:15:02  对本文有异议

??一、mediaquery

??1.概述

媒体查询(mediaquery)它允许根据设备的不同特性(如屏幕大小、屏幕方向、分辨率、颜色深度等)来动态地调整网页的样式和布局。

通过媒体查询,可以为不同的设备定义不同的样式规则,以适应不同的屏幕大小和分辨率。这样就可以实现响应式设计,使页面在不同设备上表现一致、完美。例如,可以通过媒体查询设置某些元素在手机屏幕上隐藏,而在电脑屏幕上显示等。

媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。

媒体查询常用于下面应用场景:

image

??2.引入与使用流程

1、导入相关模块

  1. import mediaquery from '@ohos.mediaquery';

2、通过matchMediaSync接口设置媒体查询条件,保存返回的条件监听句柄listener。例如监听横屏事件:

  1. let listener = mediaquery.matchMediaSync('(orientation: landscape)');

给条件监听句柄listener绑定回调函数onPortrait,当listener检测设备状态变化时执行回调函数。在回调函数内,根据不同设备状态更改页面布局或者实现业务逻辑。

  1. onPortrait(mediaQueryResult) {
  2. if (mediaQueryResult.matches) {
  3. // do something here
  4. } else {
  5. // do something here
  6. }
  7. }
  8. listener.on('change', onPortrait);

??3.媒体查询条件

??3.1 语法规则

  1. [media-type] [media-logic-operations] [(media-feature)]

例如:screen and (device-type: tv) or (resolution < 2) :表示包含多个媒体特征的多条件复杂语句查询,当设备类型为tv或设备分辨率小于2时条件成立。

??3.2 媒体类型

screen是一种媒体类型,用于匹配屏幕设备,包括计算机屏幕、移动设备屏幕和平板电脑等。在使用screen媒体类型时,可以为不同分辨率的屏幕应用不同的样式,从而优化UI的响应式设计。

image

??3.3 媒体逻辑操作

媒体逻辑操作符:and、or、not、only用于构成复杂媒体查询,也可以通过comma(, )将其组合起来。

image

媒体范围操作符包括<=,>=,<,>用于比较媒体条件

image

??3.4 媒体特征

媒体查询中的媒体特征是用来描述设备的特定属性,以便在不同的视口和屏幕大小下应用不同的样式。

image

??4.案例

??4.1 Stage模型

  1. import mediaquery from '@ohos.mediaquery';
  2. import window from '@ohos.window';
  3. import common from '@ohos.app.ability.common';
  4. let portraitFunc = null;
  5. @Entry
  6. @Component
  7. struct MediaQueryExample {
  8. @State color: string = '#DB7093';
  9. @State text: string = 'Portrait';
  10. // 当设备横屏时条件成立
  11. listener = mediaquery.matchMediaSync('(orientation: landscape)');
  12. // 当满足媒体查询条件时,触发回调
  13. onPortrait(mediaQueryResult) {
  14. if (mediaQueryResult.matches) { // 若设备为横屏状态,更改相应的页面布局
  15. this.color = '#FFD700';
  16. this.text = 'Landscape';
  17. } else {
  18. this.color = '#DB7093';
  19. this.text = 'Portrait';
  20. }
  21. }
  22. aboutToAppear() {
  23. // 绑定当前应用实例
  24. portraitFunc = this.onPortrait.bind(this);
  25. // 绑定回调函数
  26. this.listener.on('change', portraitFunc);
  27. }
  28. // 改变设备横竖屏状态函数
  29. private changeOrientation(isLandscape: boolean) {
  30. // 获取UIAbility实例的上下文信息
  31. let context = getContext(this) as common.UIAbilityContext;
  32. // 调用该接口手动改变设备横竖屏状态
  33. window.getLastWindow(context).then((lastWindow) => {
  34. lastWindow.setPreferredOrientation(isLandscape ? window.Orientation.LANDSCAPE : window.Orientation.PORTRAIT)
  35. });
  36. }
  37. build() {
  38. Column({ space: 50 }) {
  39. Text(this.text).fontSize(50).fontColor(this.color)
  40. Text('Landscape').fontSize(50).fontColor(this.color).backgroundColor(Color.Orange)
  41. .onClick(() => {
  42. this.changeOrientation(true);
  43. })
  44. Text('Portrait').fontSize(50).fontColor(this.color).backgroundColor(Color.Orange)
  45. .onClick(() => {
  46. this.changeOrientation(false);
  47. })
  48. }
  49. .width('100%').height('100%')
  50. }
  51. }

??4.2 FA模型

  1. import mediaquery from '@ohos.mediaquery';
  2. import featureAbility from '@ohos.ability.featureAbility';
  3. let portraitFunc = null;
  4. @Entry
  5. @Component
  6. struct MediaQueryExample {
  7. @State color: string = '#DB7093';
  8. @State text: string = 'Portrait';
  9. listener = mediaquery.matchMediaSync('(orientation: landscape)'); // 当设备横屏时条件成立
  10. onPortrait(mediaQueryResult) { // 当满足媒体查询条件时,触发回调
  11. if (mediaQueryResult.matches) { // 若设备为横屏状态,更改相应的页面布局
  12. this.color = '#FFD700';
  13. this.text = 'Landscape';
  14. } else {
  15. this.color = '#DB7093';
  16. this.text = 'Portrait';
  17. }
  18. }
  19. aboutToAppear() {
  20. portraitFunc = this.onPortrait.bind(this); // 绑定当前应用实例
  21. this.listener.on('change', portraitFunc); //绑定回调函数
  22. }
  23. build() {
  24. Column({ space: 50 }) {
  25. Text(this.text).fontSize(50).fontColor(this.color)
  26. Text('Landscape').fontSize(50).fontColor(this.color).backgroundColor(Color.Orange)
  27. .onClick(() => {
  28. let context = featureAbility.getContext();
  29. context.setDisplayOrientation(0); //调用该接口手动改变设备横竖屏状态
  30. })
  31. Text('Portrait').fontSize(50).fontColor(this.color).backgroundColor(Color.Orange)
  32. .onClick(() => {
  33. let context = featureAbility.getContext();
  34. context.setDisplayOrientation(1); //调用该接口手动改变设备横竖屏状态
  35. })
  36. }
  37. .width('100%').height('100%')
  38. }
  39. }

image

image

??写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing??,不定期分享原创知识。
  • 更多鸿蒙最新技术知识点,请关注作者博客:https://t.doruo.cn/14DjR1rEY

image

原文链接:https://www.cnblogs.com/shudaoshan/p/18099093

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号