harmony 鸿蒙使用镜像能力
使用镜像能力
概述
为满足不同用户的阅读习惯,ArkUI提供了镜像能力。在特定情况下将显示内容在X轴上进行镜像反转,由从左向右显示变成从右向左显示。
镜像前 | 镜像后 |
---|---|
当组件满足以下任意条件时,镜像能力生效:
组件的direction属性设置为Direction.Rtl。
组件的direction属性设置为Direction.Auto,且当前的系统语言(如维吾尔语)的阅读习惯是从右向左。
基本概念
- LTR:顺序为从左向右。
- RTL:顺序为从右向左。
使用约束
ArkUI 如下能力已默认适配镜像:
但如下三种场景还需要进行适配:
界面布局、边框设置:关于方向类的通用属性,如果需要支持镜像能力,使用泛化的方向指示词 start/end入参类型替换 left/right、x/y等绝对方向指示词的入参类型,来表示自适应镜像能力。
Canvas组件只有限支持文本绘制的镜像能力。
XComponent组件不支持组件镜像能力。
界面布局和边框设置
目前,以下三类通用属性需要使用新入参类型适配:
位置设置:position、markAnchor、offset、alignRules
边框设置:borderWidth、borderColor、borderRadius
以position为例,需要把绝对方向x、y描述改为新入参类型start、end的描述,其他属性类似。
import { LengthMetrics } from '@kit.ArkUI';
@Entry
@Component
struct Index1 {
build() {
Stack({ alignContent: Alignment.TopStart }) {
Stack({ alignContent: Alignment.TopStart }) {
Column()
.width(100)
.height(100)
.backgroundColor(Color.Red)
.position({ start: LengthMetrics.px(200), top: LengthMetrics.px(200) }) //需要同时支持LTR和RTL时使用API12新增的LocalizedEdges入参类型,
//仅支持LTR时等同于.position({ x: '200px', y: '200px' })
}.backgroundColor(Color.Blue)
}.width("100%").height("100%").border({ color: '#880606' })
}
}
自定义绘制Canvas组件
Canvas组件的绘制内容和坐标均不支持镜像能力。已绘制到Canvas组件上的内容并不会跟随系统语言的切换自动做镜像效果。
CanvasRenderingContext2D的文本绘制支持镜像能力,在使用时需要与Canvas组件的通用属性direction(组件显示方向)和CanvasRenderingContext2D的属性direction(文本绘制方向)协同使用。具体规格如下:
- 优先级:CanvasRenderingContext2D的direction属性 > Canvas组件通用属性direction > 系统语言决定的水平显示方向。
- Canvas组件本身不会自动跟随系统语言切换镜像效果,需要应用监听到系统语言切换后自行重新绘制。
- CanvasRenderingContext2D绘制文本时,只有符号等文本会对绘制方向生效,英文字母和数字不响应绘制方向的变化。
import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
@State message: string = 'Hello world';
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
aboutToAppear(): void {
// 监听系统语言切换
let subscriber: commonEventManager.CommonEventSubscriber|null = null;
let subscribeInfo2: commonEventManager.CommonEventSubscribeInfo = {
events: ["usual.event.LOCALE_CHANGED"],
}
commonEventManager.createSubscriber(subscribeInfo2, (err: BusinessError, data: commonEventManager.CommonEventSubscriber) => {
if (err) {
console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);
return;
}
subscriber = data;
if (subscriber !== null) {
commonEventManager.subscribe(subscriber, (err: BusinessError, data: commonEventManager.CommonEventData) => {
if (err) {
console.error(`订阅语言地区状态变化公共事件失败. Code is ${err.code}, message is ${err.message}`);
return;
}
console.info('成功订阅语言地区状态变化公共事件: data: ' + JSON.stringify(data))
// 监听到语言切换后,需要重新绘制Canvas内容
this.drawText();
})
} else {
console.error(`MayTest Need create subscriber`);
}
})
}
drawText(): void {
console.error("MayTest drawText")
this.context.reset()
this.context.direction = "inherit"
this.context.font = '30px sans-serif'
this.context.fillText("ab%123&*@", 50, 50)
}
build() {
Row() {
Canvas(this.context)
.direction(Direction.Auto)
.width("100%")
.height("100%")
.onReady(() =>{
this.drawText()
})
.backgroundColor(Color.Pink)
}
.height('100%')
}
}
镜像前 | 镜像后 |
---|---|
![]() |
![]() |
你可能感兴趣的鸿蒙文章
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦