1# Using the Mirroring Capability
2
3## Overview
4
5To accommodate diverse user reading habits, ArkUI provides a mirroring capability that can reverse the display content along the x-axis, switching the layout from left-to-right to right-to-left.
6
7| Before Mirroring         | After Mirroring                                 |
8| ----------- | ----------------------------------- |
9|![](figures/mirroring_1-0.PNG)|![](figures/mirroring_1-1.PNG)|
10
11The mirroring capability is activated on a component under either of these conditions:
12
131. The component's **direction** attribute is set to **Direction.Rtl**.
14
152. The component's **direction** attribute is set to **Direction.Auto**, and the system language in use (such as Uyghur) is read from right to left.
16
17## Basic Concepts
18
19- LTR: left-to-right reading direction
20- RTL: right-to-Left reading direction
21
22## Constraints
23
24ArkUI has default mirroring support for the following capabilities:
25
26| Category    | Name                                                        |
27| -------- | ------------------------------------------------------------ |
28| Basic components| [Swiper](../reference/apis-arkui/arkui-ts/ts-container-swiper.md), [Tab](../reference/apis-arkui/arkui-ts/ts-container-tabs.md), [TabContent](../reference/apis-arkui/arkui-ts/ts-container-tabcontent.md), [List](../reference/apis-arkui/arkui-ts/ts-container-list.md), [Progress](../reference/apis-arkui/arkui-ts/ts-basic-components-progress.md), [CalendarPicker](../reference/apis-arkui/arkui-ts/ts-basic-components-calendarpicker.md), [CalendarPickerDialog](../reference/apis-arkui/arkui-ts/ts-methods-calendarpicker-dialog.md), [TextPicker](../reference/apis-arkui/arkui-ts/ts-basic-components-textpicker.md), [TextPickerDialog](../reference/apis-arkui/arkui-ts/ts-methods-textpicker-dialog.md), [DatePicker](../reference/apis-arkui/arkui-ts/ts-basic-components-datepicker.md), [DatePickerDialog](../reference/apis-arkui/arkui-ts/ts-methods-datepicker-dialog.md), [Grid](../reference/apis-arkui/arkui-ts/ts-container-grid.md), [WaterFlow](../reference/apis-arkui/arkui-ts/ts-container-waterflow.md), [Scroll](../reference/apis-arkui/arkui-ts/ts-container-scroll.md), [ScrollBar](../reference/apis-arkui/arkui-ts/ts-basic-components-scrollbar.md), [AlphabetIndexer](../reference/apis-arkui/arkui-ts/ts-container-alphabet-indexer.md), [Stepper](../reference/apis-arkui/arkui-ts/ts-basic-components-stepper.md), [SideBarContainer](../reference/apis-arkui/arkui-ts/ts-container-sidebarcontainer.md), [Navigation](../reference/apis-arkui/arkui-ts/ts-basic-components-navigation.md), [NavDestination](../reference/apis-arkui/arkui-ts/ts-basic-components-navdestination.md), [Rating](../reference/apis-arkui/arkui-ts/ts-basic-components-rating.md), [Slider](../reference/apis-arkui/arkui-ts/ts-basic-components-slider.md), [Toggle](../reference/apis-arkui/arkui-ts/ts-basic-components-toggle.md), [Badge](../reference/apis-arkui/arkui-ts/ts-container-badge.md), [Counter](../reference/apis-arkui/arkui-ts/ts-container-counter.md), [Chip](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-Chip.md), [SegmentButton](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-SegmentButton.md), [bindMenu](../reference/apis-arkui/arkui-ts/ts-universal-attributes-menu.md#bindmenu), [bindContextMenu](../reference/apis-arkui/arkui-ts/ts-universal-attributes-menu.md#bindcontextmenu8), [TextInput](../reference/apis-arkui/arkui-ts/ts-basic-components-textinput.md), [TextArea](../reference/apis-arkui/arkui-ts/ts-basic-components-textarea.md), [Search](../reference/apis-arkui/arkui-ts/ts-basic-components-search.md), [Stack](../reference/apis-arkui/arkui-ts/ts-container-stack.md), [GridRow](../reference/apis-arkui/arkui-ts/ts-container-gridrow.md), [Text](../reference/apis-arkui/arkui-ts/ts-basic-components-text.md), [Select](../reference/apis-arkui/arkui-ts/ts-basic-components-select.md), [Marquee](../reference/apis-arkui/arkui-ts/ts-basic-components-marquee.md), [Row](../reference/apis-arkui/arkui-ts/ts-container-row.md), [Column](../reference/apis-arkui/arkui-ts/ts-container-column.md), [Flex](../reference/apis-arkui/arkui-ts/ts-container-flex.md), [RelativeContainer](../reference/apis-arkui/arkui-ts/ts-container-relativecontainer.md), [ListItemGroup](../reference/apis-arkui/arkui-ts/ts-container-listitemgroup.md)|
29| Advanced components| [SelectionMenu](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-SelectionMenu.md) , [TreeView](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-TreeView.md) , [Filter](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-Filter.md), [SplitLayout](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-SplitLayout.md), [ToolBar](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-ToolBar.md), [ComposeListItem](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-ComposeListItem.md), [EditableTitleBar](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-EditableTitleBar.md), [ProgressButton](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-ProgressButton.md), [SubHeader](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-SubHeader.md) , [Popup](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-Popup.md), [Dialog](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-Dialog.md), [SwipeRefresher](../reference/apis-arkui/arkui-ts/ohos-arkui-advanced-SwipeRefresher.md)|
30| Universal attributes| [position](../reference/apis-arkui/arkui-ts/ts-universal-attributes-location.md#position), [markAnchor](../reference/apis-arkui/arkui-ts/ts-universal-attributes-location.md#markanchor), [offset](../reference/apis-arkui/arkui-ts/ts-universal-attributes-location.md#offset), [alignRules](../reference/apis-arkui/arkui-ts/ts-universal-attributes-location.md#alignrules9), [borderWidth](../reference/apis-arkui/arkui-ts/ts-universal-attributes-border.md#borderwidth), [borderColor](../reference/apis-arkui/arkui-ts/ts-universal-attributes-border.md#bordercolor), [borderRadius](../reference/apis-arkui/arkui-ts/ts-universal-attributes-border.md#borderradius), [padding](../reference/apis-arkui/arkui-ts/ts-universal-attributes-size.md#padding), [margin](../reference/apis-arkui/arkui-ts/ts-universal-attributes-size.md#margin)|
31| APIs    | [AlertDialog](../reference/apis-arkui/arkui-ts/ts-methods-alert-dialog-box.md), [ActionSheet](../reference/apis-arkui/arkui-ts/ts-methods-action-sheet.md), [promptAction.showDialog](../reference/apis-arkui/js-apis-promptAction.md#promptactionshowdialog), [promptAction.showToast](../reference/apis-arkui/js-apis-promptAction.md#promptactionshowtoast)|
32
33However, adaptation is still required in the following three scenarios:
34
351. For layout and border settings, use the generalized direction terms **start** and **end** as parameter types instead of absolute terms such as **left**, **right**, **x**, and **y**, to accommodate mirroring.
36
372. The **Canvas** component offers limited support for mirroring in text drawing only.
38
393. The **XComponent** component does not support mirroring capabilities.
40
41## Layout and Border Settings
42
43To adapt to mirroring capabilities, update the following universal attributes with new parameter types:
44
45Position settings: [position](../reference/apis-arkui/arkui-ts/ts-universal-attributes-location.md#position), [markAnchor](../reference/apis-arkui/arkui-ts/ts-universal-attributes-location.md#markanchor), [offset](../reference/apis-arkui/arkui-ts/ts-universal-attributes-location.md#offset), [alignRules](../reference/apis-arkui/arkui-ts/ts-universal-attributes-location.md#alignrules12)
46
47Border settings: [borderWidth](../reference/apis-arkui/arkui-ts/ts-universal-attributes-border.md#borderwidth), [borderColor](../reference/apis-arkui/arkui-ts/ts-universal-attributes-border.md#bordercolor), [borderRadius](../reference/apis-arkui/arkui-ts/ts-universal-attributes-border.md#borderradius)
48
49Size settings: [padding](../reference/apis-arkui/arkui-ts/ts-universal-attributes-size.md#padding), [margin](../reference/apis-arkui/arkui-ts/ts-universal-attributes-size.md#margin)
50
51For example, with **position**, change the absolute directional descriptions of **x** and **y** to the new parameter types of **start** and **end**.
52
53```typeScript
54import { LengthMetrics } from '@kit.ArkUI';
55
56@Entry
57@Component
58struct Index1 {
59  build() {
60    Stack({ alignContent: Alignment.TopStart }) {
61      Stack({ alignContent: Alignment.TopStart }) {
62        Column()
63          .width(100)
64          .height(100)
65          .backgroundColor(Color.Red)
66          .position({ start: LengthMetrics.px(200), top: LengthMetrics.px(200) })  // Use the new LocalizedEdges parameter type added since API version 12 for supporting both LTR and RTL.
67                                                                                   // It is equivalent to .position({ x: '200px', y: '200px' }) when only LTR is supported.
68
69      }.backgroundColor(Color.Blue)
70    }.width("100%").height("100%").border({ color: '#880606' })
71  }
72}
73```
74
75## Custom Drawing with the Canvas Component
76
77The drawings and coordinates of the **Canvas** component do not support mirroring. Content drawn on it does not automatically mirror when the system language changes.
78
79[CanvasRenderingContext2D](../reference/apis-arkui/arkui-ts/ts-canvasrenderingcontext2d.md) supports mirroring for text rendering, which should be used with the **Canvas** component's **direction** attribute and the **direction** attribute of **CanvasRenderingContext2D**. The specific specifications are as follows:
80
811. Priority: The **direction** attribute of **CanvasRenderingContext2D** takes precedence over the **Canvas** component's **direction** attribute, which in turn follows the system language's horizontal display direction.
822. The **Canvas** component does not automatically mirror with system language changes; applications must listen for system language changes and redraw the content on their own.
833. Only symbols follow the direction setting during text drawing with **CanvasRenderingContext2D**; Latin characters and numbers do not.
84
85```typeScript
86import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
87
88@Entry
89@Component
90struct Index {
91  @State message: string = 'Hello world';
92  private settings: RenderingContextSettings = new RenderingContextSettings(true)
93  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
94
95  aboutToAppear(): void {
96    // Listen for the system language changes.
97    let subscriber: commonEventManager.CommonEventSubscriber | null = null;
98    let subscribeInfo2: commonEventManager.CommonEventSubscribeInfo = {
99      events: ["usual.event.LOCALE_CHANGED"],
100    }
101    commonEventManager.createSubscriber(subscribeInfo2, (err: BusinessError, data: commonEventManager.CommonEventSubscriber) => {
102      if (err) {
103        console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);
104        return;
105      }
106
107      subscriber = data;
108      if (subscriber !== null) {
109        commonEventManager.subscribe(subscriber, (err: BusinessError, data: commonEventManager.CommonEventData) => {
110          if (err) {
111            console.error(`Failed to subscribe to the language and region status change event. Code: ${err.code}; message: ${err.message}`);
112            return;
113          }
114          console.info('Successfully subscribed to the language and region status change event: data: ' + JSON.stringify(data))
115          // After detecting the language switch, redraw the content on the Canvas component.
116          this.drawText();
117        })
118      } else {
119        console.error(`MayTest Need create subscriber`);
120      }
121    })
122  }
123
124  drawText(): void {
125    console.error("MayTest drawText")
126    this.context.reset()
127    this.context.direction = "inherit"
128    this.context.font = '30px sans-serif'
129    this.context.fillText("ab%123&*@", 50, 50)
130  }
131
132  build() {
133    Row() {
134      Canvas(this.context)
135        .direction(Direction.Auto)
136        .width("100%")
137        .height("100%")
138        .onReady(() =>{
139          this.drawText()
140        })
141        .backgroundColor(Color.Pink)
142    }
143    .height('100%')
144  }
145
146}
147```
148
149| Before Mirroring         | After Mirroring                                 |
150| ----------- | ----------------------------------- |
151|![](figures/mirroring_2-0.jpg)|![](figures/mirroring_2-1.jpg)|
152