回复
#物联网征文# ArkUI中利用媒体查询实现不同布局 原创
鸿蒙坚果派
发布于 2022-8-3 15:13
浏览
1收藏
大家都知道,我们的手机经常会有横竖屏切换到功能,这个时候对于一些样式,我们就要去做一些不同的适配才可以,那么,我们如何实现这个功能呢,其实很简单,我们首先要做的就是媒体查询。
媒体查询(Media Query)在移动设备上应用十分广泛,开发者经常需要根据设备的大致类型或者特定的特征和设备参数(例如屏幕分辨率)来修改应用的样式。为此媒体查询提供了如下功能:
- 针对设备和应用的属性信息,可以设计出相匹配的布局样式。
- 当屏幕发生动态改变时(比如分屏、横竖屏切换),应用页面布局同步更新。
如何使用
通过调用媒体查询接口,设置媒体查询条件和查询结果的回调函数,在对应的条件的回调函数里更改页面布局或者实现业务逻辑。
首先导入媒体查询模块,例如:
import mediaquery from '@ohos.mediaquery'
然后通过matchMediaSync接口设置媒体查询条件,并保存返回的条件监听句柄,例如:
listener = mediaquery.matchMediaSync('(orientation: landscape)')
最后通过上面保存的条件监听句柄listener去注册回调函数,在回调函数里更改页面布局或者实现业务逻辑,当匹配到媒体查询条件时会触发此回调函数,例如:
import mediaquery from '@ohos.mediaquery'
let listener = mediaquery.matchMediaSync('(orientation: landscape)'); //监听横屏事件
function onPortrait(mediaQueryResult) {
if (mediaQueryResult.matches) {
//你的逻辑
this.islandscape = true
} else {
//你的逻辑
this.islandscape = false
}
}
this.listener.on('change', this.onPortrait) // 注册回调
this.listener.off('change', this.onPortrait) // 去注册回调
例子:
import mediaquery from '@ohos.mediaquery'
let portraitFunc = null
@Entry
@Component
struct MediaQueryExample {
@State islandscape: boolean = false
listener = mediaquery.matchMediaSync('(orientation: landscape)')
onPortrait(mediaQueryResult) {
if (mediaQueryResult.matches) {
this.islandscape = true
} else {
this.islandscape = false
}
}
aboutToAppear() {
portraitFunc = this.onPortrait.bind(this) //bind current js instance
this.listener.on('change', portraitFunc)
}
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Text( this.islandscape==true ? "横屏显示": "竖屏显示")
.backgroundColor(Color.Blue)
.textAlign(TextAlign.Center)
.fontSize('50fp')
.fontColor(Color.White)
.width('100%')
.height('100vp')
}
.width('100%').height('100%')
}
}
媒体查询条件语法规则
[media-type] [and|not|only] [(media-feature)]
例如:
screen and (round-screen: true) :当设备屏幕是圆形时条件成立
(max-height: 800) :当高度小于800时条件成立
(height <= 800) :当高度小于800时条件成立
screen and (device-type: tv) or (resolution < 2) :包含多个媒体特征的多条件复杂语句查询
媒体特征(media-feature)
类型 | 说明 |
---|---|
height | 应用页面显示区域的高度。 |
min-height | 应用页面显示区域的最小高度。 |
max-height | 应用页面显示区域的最大高度。 |
width | 应用页面显示区域的宽度。 |
min-width | 应用页面显示区域的最小宽度。 |
max-width | 应用页面显示区域的最大宽度。 |
resolution | 设备的分辨率,支持dpi,dppx和dpcm单位。其中:- dpi表示每英寸中物理像素个数,1dpi≈0.39dpcm;- dpcm表示每厘米上的物理像素个数,1dpcm ≈ 2.54dpi;- dppx表示每个px中的物理像素数(此单位按96px=1英寸为基准,与页面中的px单位计算方式不同),1dppx = 96dpi。 |
min-resolution | 设备的最小分辨率。 |
max-resolution | 设备的最大分辨率。 |
orientation | 屏幕的方向。可选值:- orientation: portrait(设备竖屏)- orientation: landscape(设备横屏) |
device-height | 设备的高度。 |
min-device-height | 设备的最小高度。 |
max-device-height | 设备的最大高度。 |
device-width | 设备的宽度。 |
min-device-width | 设备的最小宽度。 |
max-device-width | 设备的最大宽度。 |
round-screen | 屏幕类型,圆形屏幕为true, 非圆形屏幕为 false。 |
dark-mode | 系统为深色模式时为true,否则为false。 |
参考文档
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
赞
2
收藏 1
回复
相关推荐