From 7d48e48c30609112facda8bee6489d8632d04f3c Mon Sep 17 00:00:00 2001 From: "ester.zhou" Date: Fri, 12 May 2023 17:21:49 +0800 Subject: [PATCH] Update docs (17455) Signed-off-by: ester.zhou --- ...8.png => en-us_image_0000001127125162.png} | Bin ...f.png => en-us_image_0000001167952236.png} | Bin ...e.png => en-us_image_0000001214823665.png} | Bin .../reference/arkui-js/figures/js-text.png | Bin 0 -> 96033 bytes .../js-components-basic-picker-view.md | 455 +++++++++--------- .../arkui-js/js-components-basic-text.md | 2 +- ...ponents-canvas-canvasrenderingcontext2d.md | 20 +- ...js-components-container-list-item-group.md | 91 ++-- .../arkui-ts/ts-combined-gestures.md | 27 +- .../arkui-ts/ts-components-canvas-canvas.md | 3 +- .../reference/arkui-ts/ts-container-grid.md | 4 +- .../reference/arkui-ts/ts-container-list.md | 4 +- .../reference/arkui-ts/ts-container-panel.md | 20 +- .../arkui-ts/ts-container-refresh.md | 36 +- .../arkui-ts/ts-container-sidebarcontainer.md | 61 ++- .../reference/arkui-ts/ts-container-swiper.md | 75 ++- .../arkui-ts/ts-container-tabcontent.md | 4 +- .../reference/arkui-ts/ts-container-tabs.md | 13 +- .../arkui-ts/ts-methods-custom-dialog-box.md | 28 +- .../arkui-ts/ts-universal-attributes-popup.md | 65 +-- .../ts-universal-attributes-visibility.md | 6 +- .../ts-universal-events-keyboardshortcut.md | 121 +++++ 22 files changed, 619 insertions(+), 416 deletions(-) rename en/application-dev/reference/arkui-js/figures/{screenshot-8.png => en-us_image_0000001127125162.png} (100%) rename en/application-dev/reference/arkui-js/figures/{smoothoff.png => en-us_image_0000001167952236.png} (100%) rename en/application-dev/reference/arkui-js/figures/{ellipse.png => en-us_image_0000001214823665.png} (100%) create mode 100644 en/application-dev/reference/arkui-js/figures/js-text.png create mode 100644 en/application-dev/reference/arkui-ts/ts-universal-events-keyboardshortcut.md diff --git a/en/application-dev/reference/arkui-js/figures/screenshot-8.png b/en/application-dev/reference/arkui-js/figures/en-us_image_0000001127125162.png similarity index 100% rename from en/application-dev/reference/arkui-js/figures/screenshot-8.png rename to en/application-dev/reference/arkui-js/figures/en-us_image_0000001127125162.png diff --git a/en/application-dev/reference/arkui-js/figures/smoothoff.png b/en/application-dev/reference/arkui-js/figures/en-us_image_0000001167952236.png similarity index 100% rename from en/application-dev/reference/arkui-js/figures/smoothoff.png rename to en/application-dev/reference/arkui-js/figures/en-us_image_0000001167952236.png diff --git a/en/application-dev/reference/arkui-js/figures/ellipse.png b/en/application-dev/reference/arkui-js/figures/en-us_image_0000001214823665.png similarity index 100% rename from en/application-dev/reference/arkui-js/figures/ellipse.png rename to en/application-dev/reference/arkui-js/figures/en-us_image_0000001214823665.png diff --git a/en/application-dev/reference/arkui-js/figures/js-text.png b/en/application-dev/reference/arkui-js/figures/js-text.png new file mode 100644 index 0000000000000000000000000000000000000000..65f36bddf4015f870e67edf7a96d1457014d1b3c GIT binary patch literal 96033 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 LjI^sXZNvWupJa(X literal 0 HcmV?d00001 diff --git a/en/application-dev/reference/arkui-js/js-components-basic-picker-view.md b/en/application-dev/reference/arkui-js/js-components-basic-picker-view.md index ee7d77b8d9..a710010f66 100644 --- a/en/application-dev/reference/arkui-js/js-components-basic-picker-view.md +++ b/en/application-dev/reference/arkui-js/js-components-basic-picker-view.md @@ -1,7 +1,6 @@ # picker-view > **NOTE** -> > This component is supported since API version 4. Updates will be marked with a superscript to indicate their earliest API version. The **\** component provides the view that shows an embedded scrollable selector on the screen. @@ -121,228 +120,232 @@ Not supported ## Example -1. Text Selector - ```html - -
- - Selected value: {{value}} Selected index: {{index}} - - -
- ``` - - ```css - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 50%; - } - .title { - font-size: 30px; - text-align: center; - margin-top: 50%; - } - ``` - - ```js - /* xxx.js */ - export default { - data: { - options: ['Option 1','Option 2','Option 3'], - value: "Option 1", - index: 0 - }, - handleChange(data) { - this.value = data.newValue; - this.index = data.newSelected; - }, - } - ``` - ![picker-view0](figures/picker-view0.gif) - -2. Time Selector - ```html - -
- - Selected: {{time}} - - -
- ``` - - ```css - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 50%; - } - .title { - font-size: 31px; - text-align: center; - margin-top: 50%; - } - ``` - - ```js - /* xxx.js */ - export default { - data: { - defaultTime: "", - time: "", - }, - onInit() { - this.defaultTime = this.now(); - }, - handleChange(data) { - this.time = this.concat(data.hour, data.minute); - }, - now() { - const date = new Date(); - const hours = date.getHours(); - const minutes = date.getMinutes(); - return this.concat(hours, minutes); - }, - fill(value) { - return (value > 9 ? "" : "0") + value; - }, - concat(hours, minutes) { - return `${this.fill(hours)}:${this.fill(minutes)}`; - }, - } - ``` - - ![picker-view1](figures/picker-view1.gif) - -3. Date Selector - ```html - -
- - Selected: {{date}} - - -
- ``` - - ```css - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 50%; - } - .title { - font-size: 31px; - text-align: center; - margin-top: 50%; - } - ``` - - ```js - /* xxx.js */ - export default { - data: { - date: "", - }, - handleChange(data) { - this.date = data.year + "/" + data.month + "/" + data.day + ""; - }, - } - ``` - ![picker-view2](figures/picker-view2.gif) - -4. Date and Time Selector - ```html - -
- - Selected: {{datetime}} - - -
- ``` - - ```css - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 50%; - } - .title { - font-size: 31px; - text-align: center; - margin-top: 50%; - } - ``` - - ```js - /* xxx.js */ - export default { - data: { - datetime: "", - }, - handleChange(data) { - this.datetime = data.year + "/" + data.month + "/" + data.day + "" + data.hour + ":" + data.minute + ""; - }, - } - ``` - ![picker-view3](figures/picker-view3.gif) - -5. Multi-Column Text Selector - - ```html - -
- - Selected: {{ value }} - - -
- ``` - - ```css - /* xxx.css */ - .container { - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 50%; - } - .title { - font-size: 31px; - text-align: center; - margin-top: 50%; - } - ``` - - ```js - /* xxx.js */ - export default { - data: { - multitext: [ - [1, 2, 3], - [4, 5, 6], - [7, 8, 9], - ], - value: "" - }, - handleChange(data) { - this.value = "Selected: " + data.column + "," + "value: " + data.newValue + ", index:" + data.newSelected; - }, - } - ``` - ![picker-view4](figures/picker-view4.gif) +### Text Selector + +```html + +
+ + Selected value: {{value}} Selected index: {{index}} + + +
+``` + +```css +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 50%; +} +.title { + font-size: 30px; + text-align: center; + margin-top: 50%; +} +``` + +```js +/* xxx.js */ +export default { + data: { + options: ['Option 1','Option 2','Option 3'], + value: "Option 1", + index: 0 + }, + handleChange(data) { + this.value = data.newValue; + this.index = data.newSelected; + }, +} +``` +![picker-view0](figures/picker-view0.gif) + +### Time Selector + +```html + +
+ + Selected: {{time}} + + +
+``` + +```css +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 50%; +} +.title { + font-size: 31px; + text-align: center; + margin-top: 50%; +} +``` + +```js +/* xxx.js */ +export default { + data: { + defaultTime: "", + time: "", + }, + onInit() { + this.defaultTime = this.now(); + }, + handleChange(data) { + this.time = this.concat(data.hour, data.minute); + }, + now() { + const date = new Date(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + return this.concat(hours, minutes); + }, + fill(value) { + return (value > 9 ? "" : "0") + value; + }, + concat(hours, minutes) { + return `${this.fill(hours)}:${this.fill(minutes)}`; + }, +} +``` + +![picker-view1](figures/picker-view1.gif) + +### Date Selector + +```html + +
+ + Selected: {{date}} + + +
+``` + +```css +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 50%; +} +.title { + font-size: 31px; + text-align: center; + margin-top: 50%; +} +``` + +```js +/* xxx.js */ +export default { + data: { + date: "", + }, + handleChange(data) { + this.date = data.year + "/" + data.month + "/" + data.day + ""; + }, +} +``` +![picker-view2](figures/picker-view2.gif) + +### Date and Time Selector + +```html + +
+ + Selected: {{datetime}} + + +
+``` + +```css +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 50%; +} +.title { + font-size: 31px; + text-align: center; + margin-top: 50%; +} +``` + +```js +/* xxx.js */ +export default { + data: { + datetime: "", + }, + handleChange(data) { + this.datetime = data.year + "/" + data.month + "/" + data.day + "" + data.hour + ":" + data.minute + ""; + }, +} +``` +![picker-view3](figures/picker-view3.gif) + +### Multi-Column Text Selector + +```html + +
+ + Selected: {{ value }} + + +
+``` + +```css +/* xxx.css */ +.container { + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 50%; +} +.title { + font-size: 31px; + text-align: center; + margin-top: 50%; +} +``` + +```js +/* xxx.js */ +export default { + data: { + multitext: [ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], + ], + value: "" + }, + handleChange(data) { + this.value = "Column: " + data.column + "," + "Value: " + data.newValue + ", Index:" + data.newSelected; + }, +} +``` +![picker-view4](figures/picker-view4.gif) diff --git a/en/application-dev/reference/arkui-js/js-components-basic-text.md b/en/application-dev/reference/arkui-js/js-components-basic-text.md index 2509a3a6bc..9a90dab319 100644 --- a/en/application-dev/reference/arkui-js/js-components-basic-text.md +++ b/en/application-dev/reference/arkui-js/js-components-basic-text.md @@ -137,4 +137,4 @@ The [universal methods](../arkui-js/js-components-common-methods.md) are support ``` -![en-us_image_0000001167823076](figures/text.png) +![en-us_image_0000001167823076](figures/js-text.png) diff --git a/en/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md b/en/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md index ceefb977f2..2fdfc9bc47 100644 --- a/en/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md +++ b/en/application-dev/reference/arkui-js/js-components-canvas-canvasrenderingcontext2d.md @@ -43,7 +43,7 @@ - Anti-aliasing enabled - ![screenshot-8](figures/screenshot-8.png) + ![en-us_image_0000001127125162](figures/en-us_image_0000001127125162.png) ## Attributes @@ -558,7 +558,7 @@ export default { } ``` -![smoothoff](figures/smoothoff.png) +![en-us_image_0000001167952236](figures/en-us_image_0000001167952236.png) @@ -863,10 +863,10 @@ Moves a drawing path to a target position on the canvas. **Parameters** -| Name | Type | Description | -| ---- | ------ | --------- | -| x | number | X-coordinate of the target position.| -| y | number | Y-coordinate of the target position.| +| Name | Type | Description | +| ---- | ------ | ------------------ | +| x | number | X-coordinate of the target position.
Unit: vp| +| y | number | Y-coordinate of the target position.
Unit: vp| **Example** ```html @@ -902,8 +902,8 @@ Connects the current point to a target position using a straight line. | Name | Type | Description | | ---- | ------ | --------- | -| x | number | X-coordinate of the target position.| -| y | number | Y-coordinate of the target position.| +| x | number | X-coordinate of the target position.
Unit: vp| +| y | number | Y-coordinate of the target position.
Unit: vp| **Example** ```html @@ -1026,7 +1026,7 @@ Draws a cubic bezier curve on the canvas. ```html
- +
``` @@ -1204,7 +1204,7 @@ Draws an ellipse in the specified rectangular region on the canvas. } ``` - ![ellipse](figures/ellipse.png) + ![en-us_image_0000001214823665](figures/en-us_image_0000001214823665.png) ### rect diff --git a/en/application-dev/reference/arkui-js/js-components-container-list-item-group.md b/en/application-dev/reference/arkui-js/js-components-container-list-item-group.md index f624bc7448..1f50afab4f 100644 --- a/en/application-dev/reference/arkui-js/js-components-container-list-item-group.md +++ b/en/application-dev/reference/arkui-js/js-components-container-list-item-group.md @@ -18,7 +18,7 @@ None ## Child Components -Only the **[\](../arkui-js/js-components-container-list-item.md)** component is supported. +Only the [\](../arkui-js/js-components-container-list-item.md) child component is supported. ## Attributes @@ -31,7 +31,7 @@ In addition to the [universal attributes](../arkui-js/js-components-common-attri > **NOTE** > -> **id** in the universal attributes is used to identify a group. The input parameters of related functions and event information in the list also use **id** to uniquely identify a group. +> The universal attribute **id** is used to identify a group. The input parameters of related functions and event information in the list also use **id** to uniquely identify a group. ## Styles @@ -126,48 +126,55 @@ The [universal methods](../arkui-js/js-components-common-methods.md) are support // xxx.js import promptAction from '@ohos.promptAction'; export default { - data: { - direction: 'column', - list: [], - listAdd: [] - }, - onInit() { - this.list = [] - this.listAdd = [] - for (var i = 1; i <= 3; i++) { - var dataItem = { - value: 'GROUP' + i, - }; - this.list.push(dataItem); + data: { + direction: 'column', + list: [], + listAdd: [] + }, + onInit() { + this.list = [] + this.listAdd = [] + for (var i = 1; i <= 3; i++) { + var dataItem = { + value: 'GROUP' + i, + }; + this.list.push(dataItem); + } + }, + collapseOne(e) { + this.$element('mylist').collapseGroup({ + groupid: 'GROUP1' + }) + }, + expandOne(e) { + this.$element('mylist').expandGroup({ + groupid: 'GROUP1' + }) + }, + collapseAll(e) { + this.$element('mylist').collapseGroup({ + groupid: '' + }) + }, + expandAll(e) { + this.$element('mylist').expandGroup({ + groupid: '' + }) + }, + collapse(e) { + promptAction.showToast({ + message: 'Close ' + e.groupid + }) + }, + expand(e) { + promptAction.showToast({ + message: 'Open ' + e.groupid + }) } - }, - collapseOne(e) { - this.$element('mylist').collapseGroup({ - groupid: 'GROUP1' - }) - }, - expandOne(e) { - this.$element('mylist').expandGroup({ - groupid: 'GROUP1' - }) - }, - collapseAll(e) { - this.$element('mylist').collapseGroup() - }, - expandAll(e) { - this.$element('mylist').expandGroup() - }, - collapse(e) { - promptAction.showToast({ - message: 'Close ' + e.groupid - }) - }, - expand(e) { - promptAction.showToast({ - message: 'Open ' + e.groupid - }) - } } + + + ``` ![list6](figures/list6.gif) diff --git a/en/application-dev/reference/arkui-ts/ts-combined-gestures.md b/en/application-dev/reference/arkui-ts/ts-combined-gestures.md index 64aae057f5..a2dbe152f1 100644 --- a/en/application-dev/reference/arkui-ts/ts-combined-gestures.md +++ b/en/application-dev/reference/arkui-ts/ts-combined-gestures.md @@ -2,9 +2,9 @@ Continuous recognition, parallel recognition, and exclusive recognition are supported for a group of gestures. -> **NOTE** +> **NOTE** > -> The APIs of this module are supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version. +> The APIs of this module are supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version. ## APIs @@ -12,24 +12,24 @@ GestureGroup(mode: GestureMode, ...gesture: GestureType[]) **Parameters** -| Name| Type| Mandatory| Default Value| Description| -| -------- | -------- | -------- | -------- | -------- | -| mode | [GestureMode](#gesturemode) | Yes| - | Recognition mode of combined gestures.| -| gesture | [TapGesture](ts-basic-gestures-tapgesture.md)
\| [LongPressGesture](ts-basic-gestures-longpressgesture.md)
\| [PanGesture](ts-basic-gestures-pangesture.md)
\| [PinchGesture](ts-basic-gestures-pinchgesture.md)
\| [RotationGesture](ts-basic-gestures-rotationgesture.md) | Yes| - | Variable-length parameter, indicating one or more basic gesture types. These gestures are recognized in combination.| +| Name | Type | Mandatory | Description | +| ------- | ---------------------------------------- | ---- | ------------------------------ | +| mode | [GestureMode](#gesturemode) | Yes | Recognition mode of combined gestures. | +| gesture | [TapGesture](ts-basic-gestures-tapgesture.md)
\| [LongPressGesture](ts-basic-gestures-longpressgesture.md)
\| [PanGesture](ts-basic-gestures-pangesture.md)
\| [PinchGesture](ts-basic-gestures-pinchgesture.md)
\| [RotationGesture](ts-basic-gestures-rotationgesture.md) | Yes | Variable-length parameter, indicating one or more basic gesture types. These gestures are recognized in combination.| ## GestureMode -| Name| Description| -| -------- | -------- | -| Sequence | Sequential recognition: Gestures are recognized in the registration sequence until all gestures are recognized successfully. When one gesture fails to be recognized, all gestures fail to be recognized.| -| Parallel | Parallel recognition. Registered gestures are recognized concurrently until all gestures are recognized. The recognition result of each gesture does not affect each other.| -| Exclusive | Exclusive recognition. Registered gestures are identified concurrently. If one gesture is successfully recognized, gesture recognition ends.| +| Name | Description | +| --------- | ---------------------------------------- | +| Sequence | Sequential recognition: Gestures are recognized in the registration sequence until all gestures are recognized successfully. When one gesture fails to be recognized, all gestures fail to be recognized.| +| Parallel | Parallel recognition. Registered gestures are recognized concurrently until all gestures are recognized. The recognition result of each gesture does not affect each other. | +| Exclusive | Exclusive recognition. Registered gestures are identified concurrently. If one gesture is successfully recognized, gesture recognition ends. | ## Events -| Name| Description| -| -------- | -------- | +| Name | Description | +| ---------------------------------------- | ------------------------------------ | | onCancel(event: () => void) | Callback for the GestureMode.Sequence cancellation event.| @@ -50,6 +50,7 @@ struct GestureGroupExample { build() { Column() { Text('sequence gesture\n' + 'LongPress onAction:' + this.count + '\nPanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY) + .fontSize(15) } .translate({ x: this.offsetX, y: this.offsetY, z: 0 }) .height(150) diff --git a/en/application-dev/reference/arkui-ts/ts-components-canvas-canvas.md b/en/application-dev/reference/arkui-ts/ts-components-canvas-canvas.md index 769ac6cfbc..074f585449 100644 --- a/en/application-dev/reference/arkui-ts/ts-components-canvas-canvas.md +++ b/en/application-dev/reference/arkui-ts/ts-components-canvas-canvas.md @@ -32,8 +32,7 @@ In addition to the [universal events](ts-universal-events-click.md), the followi | Name | Parameter | Description | | ----------------------------- | ---- | -------------------- | -| onReady(event: () => void) | - | Triggered when a canvas is ready. When this event is triggered, the width and height of the canvas can be obtained, and you can use the canvas APIs to draw images.
Since API version 9, this API is supported in ArkTS widgets.| - +| onReady(event: () => void) | - | Triggered when a canvas is ready or its size changes. When this event is triggered, the canvas is cleared. The width and height of the canvas can then be obtained, and you can use the canvas APIs to draw images. If the canvas is merely relocated, the **onAreaChange** event is triggered, but the **onReady** event is not.
Since API version 9, this API is supported in ArkTS widgets.| **Example** diff --git a/en/application-dev/reference/arkui-ts/ts-container-grid.md b/en/application-dev/reference/arkui-ts/ts-container-grid.md index d70db0cd88..f301c9b24e 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-grid.md +++ b/en/application-dev/reference/arkui-ts/ts-container-grid.md @@ -48,7 +48,7 @@ In addition to the [universal attributes](ts-universal-attributes-size.md), the | rowsTemplate | string | Number of rows in the current grid layout. If this attribute is not set, one row is used by default.
For example, **'1fr 1fr 2fr'** indicates three rows, with the first row taking up 1/4 of the parent component's full height, the second row 1/4, and the third row 2/4.
**NOTE**
If this attribute is set to **'0fr'**, the row width is 0, and grid item in the row is not displayed. If this attribute is set to any other invalid value, the grid item is displayed as one row.| | columnsGap | [Length](ts-types.md#length) | Gap between columns.
Default value: **0**
**NOTE**
A value less than 0 evaluates to the default value.| | rowsGap | [Length](ts-types.md#length) | Gap between rows.
Default value: **0**
**NOTE**
A value less than 0 evaluates to the default value.| -| scrollBar | [BarState](ts-appendix-enums.md#barstate) | Scrollbar status.
Default value: **BarState.Off** | +| scrollBar | [BarState](ts-appendix-enums.md#barstate) | Scrollbar status.
Default value: **BarState.Off**
**NOTE**
In API version 9 and earlier versions, the default value is **BarState.Off**. In API version 10, the default value is **BarState.Auto**.| | scrollBarColor | string \| number \| [Color](ts-appendix-enums.md#color) | Color of the scrollbar.| | scrollBarWidth | string \| number | Width of the scrollbar. After the width is set, the scrollbar is displayed with the set width in normal state and pressed state.
Default value: **4**
Unit: vp| | cachedCount | number | Number of grid items to be preloaded (cached). It works only in [LazyForEach](../../quick-start/arkts-rendering-control-lazyforeach.md). For details, see [Minimizing White Blocks During Swiping](../../ui/arkts-performance-improvement-recommendation.md#minimizing-white-blocks-during-swiping).
Default value: **1**
**NOTE**
The number of the grid items to be cached before and after the currently displayed one equals the value of **cachedCount** multiplied by the number of columns.
Grid items that exceed the display and cache range are released.
A value less than 0 evaluates to the default value.| @@ -59,6 +59,7 @@ In addition to the [universal attributes](ts-universal-attributes-size.md), the | cellLength8+ | number | When **layoutDirection** is **Row** or **RowReverse**: fixed height per row.
When **layoutDirection** is **Column** or **ColumnReverse**: fixed width per column.
Default value: size of the first element| | multiSelectable8+ | boolean | Whether to enable mouse frame selection.
Default value: **false**
- **false**: The mouse frame selection is disabled.
- **true**: The mouse frame selection is enabled.| | supportAnimation8+ | boolean | Whether to enable animation. Currently, the grid item drag animation is supported.
Default value: **false**| +| edgeEffect10+ | [EdgeEffect](ts-appendix-enums.md#edgeeffect) | Scroll effect. The spring effect and shadow effect are supported.
Default value: **EdgeEffect.None**
| Depending on the settings of the **rowsTemplate** and **columnsTemplate** attributes, the **\** component supports the following layout modes: @@ -181,6 +182,7 @@ struct GridExample { .columnsTemplate('1fr 1fr 1fr 1fr 1fr') .columnsGap(10) .rowsGap(10) + .edgeEffect(EdgeEffect.Spring) .onScrollIndex((first: number) => { console.info(first.toString()) }) diff --git a/en/application-dev/reference/arkui-ts/ts-container-list.md b/en/application-dev/reference/arkui-ts/ts-container-list.md index 25d75ce08f..678358358c 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-list.md +++ b/en/application-dev/reference/arkui-ts/ts-container-list.md @@ -118,7 +118,7 @@ Since API version 9, this API is supported in ArkTS widgets. > **NOTE** > -> To enable the editable mode for a list, the following conditions must be met: +> To enable the editable mode for a list, the following conditions must be met: (This feature is deprecated since API version 9.) > > - **editMode** is set to **true**. > @@ -128,7 +128,7 @@ Since API version 9, this API is supported in ArkTS widgets. > > To enable dragging for a list item, the following conditions must be met: > -> - **editMode** is set to **true**. +> - **editMode** is set to **true**. (This is not required since API version 9.) > > - The list item is bound to the **onDragStart** event and the event returns a floating UI during event callback. diff --git a/en/application-dev/reference/arkui-ts/ts-container-panel.md b/en/application-dev/reference/arkui-ts/ts-container-panel.md index f67b201b35..14fe7d33b3 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-panel.md +++ b/en/application-dev/reference/arkui-ts/ts-container-panel.md @@ -11,6 +11,10 @@ The **** component is a slidable panel that presents lightweight content Supported +> **NOTE** +> +> Built-in components and custom components are allowed, with support for ([if/else](../../quick-start/arkts-rendering-control-ifelse.md), [ForEach](../../quick-start/arkts-rendering-control-foreach.md), and [LazyForEach](../../quick-start/arkts-rendering-control-lazyforeach.md)) rendering control. + ## APIs @@ -20,19 +24,20 @@ Panel(show: boolean) | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | -| show | boolean | Yes| Whether the panel is shown.| - +| show | boolean | Yes| Whether the panel is shown.
**NOTE**
The panel is hidden and does not take up space in the layout if this parameter is set to **false** or [Visible.None](ts-universal-attributes-visibility.md) is set.| ## Attributes +In addition to the [universal attributes](ts-universal-attributes-size.md), the following attributes are supported. + | Name| Type| Description| | -------- | -------- | -------- | | type | [PanelType](#paneltype)| Type of the panel.
Default value: **PanelType.Foldable**| -| mode | [PanelMode](#panelmode) | Initial status of the panel.| +| mode | [PanelMode](#panelmode) | Initial status of the panel.
Default value for the Minibar type: **PanelMode.Mini**
Default value for other types: **PanelMode.Half**
Since API version 10, this attribute supports [$$](../../quick-start/arkts-two-way-sync.md) for two-way binding of variables. | | dragBar | boolean | Whether to enable a drag bar. The value **true** means that the drag bar will be displayed, and **false** means the opposite.
Default value: **true**| -| fullHeight | string \| number | Panel height in the **PanelMode.Full** mode.| -| halfHeight | string \| number | Panel height in the **PanelMode.Half** mode. The default value is half of the screen height.| -| miniHeight | string \| number | Panel height in the **PanelMode.Mini** mode.| +| fullHeight | string \| number | Panel height in the **PanelMode.Full** mode.
Default value: main axis height of the panel minus 8 vp
**NOTE**
This attribute cannot be set in percentage.| +| halfHeight | string \| number | Panel height in the **PanelMode.Half** mode.
Default value: half of the main axis height of the panel
**NOTE**
This attribute cannot be set in percentage.| +| miniHeight | string \| number | Panel height in the **PanelMode.Mini** mode.
Default value: **48**
Unit: vp
**NOTE**
This attribute cannot be set in percentage.| | show | boolean | Whether to show the panel.| | backgroundMask9+|[ResourceColor](ts-types.md#resourcecolor)|Background mask of the panel.| @@ -52,9 +57,10 @@ Panel(show: boolean) | Half | Displays a **foldable** or **temporary** panel in a medium-sized (halfscreen-like) area. This attribute does not take effect for **minibar** panels.| | Full | Displays a panel in a large (fullscreen-like) area.| - ## Events +In addition to the [universal events](ts-universal-events-click.md), the following events are supported. + | Name| Description| | -------- | -------- | | onChange(event: (width: number, height: number, mode: PanelMode) => void) | Triggered when the status of the panel changes. The returned height value is the height of the content area. When the value of **dragBar** is **true**, the panel height is the sum of the drag bar height and content area height.| diff --git a/en/application-dev/reference/arkui-ts/ts-container-refresh.md b/en/application-dev/reference/arkui-ts/ts-container-refresh.md index 02e9c2172d..77287de660 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-refresh.md +++ b/en/application-dev/reference/arkui-ts/ts-container-refresh.md @@ -18,32 +18,36 @@ Refresh\(value: \{ refreshing: boolean, offset?: number | string , friction?: n **Parameters** -| Name| Value Type| Mandatory| Description| -| -------- | -------- | -------- | -------- | -| refreshing | boolean | Yes| Whether the current component is being refreshed.
This parameter supports [$$](../../quick-start/arkts-restrictions-and-extensions.md#two-way-binding-of-variables) for two-way binding of variables.| -| offset | string \| number | No| Distance from the pull-down starting point to the top of the component.
Default value: **16**, in vp
**NOTE**
The value cannot be a percentage or a negative number.| -| friction | number \| string | No| Coefficient of friction, which indicates the **** component's sensitivity to the pull-down gesture. The value ranges from 0 to 100.
Default value: **62**
- **0** indicates that the **\** component is not sensitive to the pull-down gesture.
- **100** indicates that the **\** component is highly sensitive to the pull-down gesture.
- A larger value indicates a more sensitive response of the **\** component to the pull-down gesture.| -| builder | [CustomBuilder](ts-types.md#custombuilder8)10+ | No| Component with the custom refresh style set for the pull-down gesture.| +| Name | Value Type | Mandatory | Description | +| ---------- | ---------------------------------------- | ---- | ---------------------------------------- | +| refreshing | boolean | Yes | Whether the current component is being refreshed.
This parameter supports [$$](../../quick-start/arkts-two-way-sync.md) for two-way binding of variables.| +| offset | string \| number | No | Distance from the pull-down starting point to the top of the component.
Default value: **16**, in vp
**NOTE**
The value cannot be a percentage or a negative number.| +| friction | number \| string | No | Coefficient of friction, which indicates the **** component's sensitivity to the pull-down gesture. The value ranges from 0 to 100.
Default value: **62**
- **0** indicates that the **\** component is not sensitive to the pull-down gesture.
- **100** indicates that the **\** component is highly sensitive to the pull-down gesture.
- A larger value indicates a more sensitive response of the **\** component to the pull-down gesture.| +| builder | [CustomBuilder](ts-types.md#custombuilder8)10+ | No | Component with the custom refresh style set for the pull-down gesture. | +## Attributes +The [universal attributes](ts-universal-attributes-size.md) are supported. ## Events +In addition to the [universal events](ts-universal-events-click.md), the following events are supported. -| Name| Description| -| -------- | -------- | + +| Name | Description | +| ---------------------------------------- | -------------------------------------- | | onStateChange(callback: (state: [RefreshStatus](#refreshstatus)) => void)| Triggered when the refresh status changes.
- **state**: refresh status.| -| onRefreshing(callback: () => void)| Triggered when the component enters the refresh state.| +| onRefreshing(callback: () => void) | Triggered when the component enters the refresh state. | ## RefreshStatus -| Name| Description| -| -------- | -------- | -| Inactive | The component is not pulled down. This is the default value.| -| Drag | The component is being pulled down, but the pulled distance is shorter than the minimum length required to trigger the refresh.| -| OverDrag | The component is being pulled down, and the pulled distance exceeds the minimum length required to trigger the refresh.| -| Refresh | The pull-down ends, and the component rebounds to the minimum length required to trigger the refresh and enters the refresh state.| -| Done | The refresh is complete, and the component returns to the initial state (top).| +| Name | Description | +| -------- | -------------------- | +| Inactive | The component is not pulled down. This is the default value. | +| Drag | The component is being pulled down, but the pulled distance is shorter than the minimum length required to trigger the refresh. | +| OverDrag | The component is being pulled down, and the pulled distance exceeds the minimum length required to trigger the refresh. | +| Refresh | The pull-down ends, and the component rebounds to the minimum length required to trigger the refresh and enters the refresh state.| +| Done | The refresh is complete, and the component returns to the initial state (top). | ## Example diff --git a/en/application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md b/en/application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md index 86400597c3..c095761baf 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md +++ b/en/application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md @@ -11,6 +11,12 @@ The **\** component contains a sidebar and content area as its Supported +> **NOTE** +> +> - Built-in components and custom components are allowed, without support for ([if/else](../../quick-start/arkts-rendering-control-ifelse.md), [ForEach](../../quick-start/arkts-rendering-control-foreach.md), and [LazyForEach](../../quick-start/arkts-rendering-control-lazyforeach.md)) rendering control. +> - This component must contain two child components. +> - If there are three or more child components, only the first and second child components are displayed. If there is only one child component, the sidebar is displayed, and the content area is blank. + ## APIs @@ -31,27 +37,29 @@ SideBarContainer( type?: SideBarContainerType ) ## Attributes +In addition to the [universal attributes](ts-universal-attributes-size.md), the following attributes are supported. + | Name| Type| Description| | -------- | -------- | -------- | -| showSideBar | boolean | Whether to display the sidebar.
Default value: **true**| -| controlButton | ButtonStyle | Attributes of the sidebar control button.| +| showSideBar | boolean | Whether to display the sidebar.
Default value: **true**
Since API version 10, this attribute supports [$$](../../quick-start/arkts-two-way-sync.md) for two-way binding of variables.| +| controlButton | [ButtonStyle](#buttonstyle) | Attributes of the sidebar control button.| | showControlButton | boolean | Whether to display the sidebar control button.
Default value: **true**| -| sideBarWidth | number \| Length9+ | Width of the sidebar.
Default value: **200**, in vp| -| minSideBarWidth | number \| Length9+ | Minimum width of the sidebar.
Default value: **200**, in vp| -| maxSideBarWidth | number \| Length9+ | Maximum width of the sidebar.
Default value: **280**, in vp| -| autoHide9+ | boolean | Whether to automatically hide the sidebar when it is dragged to be smaller than the minimum width.
Default value: **true**| -| sideBarPosition9+ | SideBarPosition | Position of the sidebar.
Default value: **SideBarPosition.Start**| +| sideBarWidth | number \| [Length](ts-types.md#length)9+ | Width of the sidebar.
Default value: **200**
Unit: vp
**NOTE**
A value less than 0 evaluates to the default value.
The value must comply with the width constraints. If it is not within the valid range, the value closest to the set one is used.
When set, the width of the sidebar takes precedence over that of the sidebar child components. If it is not set, however, the width of the sidebar child component takes precedence.| +| minSideBarWidth | number \| [Length](ts-types.md#length)9+ | Minimum width of the sidebar.
Default value: **200**, in vp
**NOTE**
A value less than 0 evaluates to the default value.
The value cannot exceed the width of the sidebar container itself. Otherwise, the width of the sidebar container itself is used.
When set, the minimum width of the sidebar takes precedence over that of the sidebar child components. If it is not set, however, the minimum width of the sidebar child component takes precedence.| +| maxSideBarWidth | number \| [Length](ts-types.md#length)9+ | Maximum width of the sidebar.
Default value: **280**, in vp
**NOTE**
A value less than 0 evaluates to the default value.
The value cannot exceed the width of the sidebar container itself. Otherwise, the width of the sidebar container itself is used.
When set, the maximum width of the sidebar takes precedence over that of the sidebar child components. If it is not set, however, the maximum width of the sidebar child component takes precedence.| +| autoHide9+ | boolean | Whether to automatically hide the sidebar when it is dragged to be smaller than the minimum width.
Default value: **true**
**NOTE**
The value is subject to the **minSideBarWidth** attribute method. If it is not set in **minSideBarWidth**, the default value is used.
Whether the sidebar should be hidden is determined when it is being dragged. When its width is less than the minimum width, the damping effect is required to trigger hiding (a distance out of range).| +| sideBarPosition9+ | [SideBarPosition](#sidebarposition9) | Position of the sidebar.
Default value: **SideBarPosition.Start**| | divider10+ | [DividerStyle](#dividerstyle10) \| null | Divider style.
- **DividerStyle** (default): The divider is displayed.
- **null**: The divider is not displayed.| ## ButtonStyle | Name| Type| Mandatory| Description| | -------- | -------- | -------- | -------- | -| left | number | No| Spacing between the sidebar control button and the left of the container.
Default value: **16**, in vp| -| top | number | No| Spacing between the sidebar control button and the top of the container.
Default value: **48**, in vp| -| width | number | No| Width of the sidebar control button.
Default value: **32**, in vp| -| height | number | No| Height of the sidebar control button.
Default value: **32**, in vp| -| icons | {
shown: string \| PixelMap \| [Resource](ts-types.md) ,
hidden: string \| PixelMap \| [Resource](ts-types.md) ,
switching?: string \| PixelMap \| [Resource](ts-types.md)
} | No| Icons of the sidebar control button.

- **shown**: icon of the control button when the sidebar is shown.
- **hidden**: icon of the control button when the sidebar is hidden.
- **switching**: icon of the control button when the sidebar is switching between the shown and hidden states.| +| left | number | No| Spacing between the sidebar control button and the left of the container.
Default value: **16**
Unit: vp| +| top | number | No| Spacing between the sidebar control button and the top of the container.
Default value: **48**
Unit: vp| +| width | number | No| Width of the sidebar control button.
Default value: **32**
Unit: vp| +| height | number | No| Height of the sidebar control button.
Default value: **32**
Unit: vp| +| icons | {
shown: string \| PixelMap \| [Resource](ts-types.md) ,
hidden: string \| PixelMap \| [Resource](ts-types.md) ,
switching?: string \| PixelMap \| [Resource](ts-types.md)
} | No| Icons of the sidebar control button.

- **shown**: icon of the control button when the sidebar is shown.
**NOTE**
When an error occurs during resource obtaining, the default icon is used.
- **hidden**: icon of the control button when the sidebar is hidden.
- **switching**: icon of the control button when the sidebar is switching between the shown and hidden states.| ## SideBarPosition9+ @@ -64,16 +72,29 @@ SideBarContainer( type?: SideBarContainerType ) | Name | Type | Mandatory| Description | | ----------- | ------------- | ---- | ---------------------------------------- | -| strokeWidth | [Length](ts-types.md#length) | Yes | Stroke width of the divider.
Default value: **1**, in vp | +| strokeWidth | [Length](ts-types.md#length) | Yes | Stroke width of the divider.
Default value: **1**
Unit: vp| | color | [ResourceColor](ts-types.md#resourcecolor) | No | Color of the divider.
Default value: **#000000, 3%** | | startMargin | [Length](ts-types.md#length) | No | Distance between the divider and the top of the sidebar.
Default value: **0**| | endMargin | [Length](ts-types.md#length) | No | Distance between the divider and the bottom of the sidebar.
Default value: **0**| +> **NOTE** +> +> When the universal attributes [width and height](ts-universal-attributes-size.md) are set for the sidebar, the **width** setting takes effect only when the sidebar container width is not set, and the **height** settings does not take effect. +> The settings of the universal attributes **width** and **height** do not take effect for the sidebar content area. By default, sidebar content area takes up the remaining space of the sidebar container. +> +> If the attribute method is not used, the sidebar is displayed depending on the size. +> +> - If the size is less than 520 vp, the sidebar is not displayed by default. +> - If the size is greater than or equal to 520 vp, the sidebar is displayed by default. +> - +> - ## Events +In addition to the [universal events](ts-universal-events-click.md), the following events are supported. + | Name| Description| | -------- | -------- | -| onChange(callback: (value: boolean) => void) | Triggered when the status of the sidebar switches between shown and hidden.

The value **true** means that the sidebar is shown, and **false** means the opposite.| +| onChange(callback: (value: boolean) => void) | Triggered when the status of the sidebar switches between shown and hidden. The value **true** means that the sidebar is displayed, and **false** means the opposite.
This event is triggered when any of the following conditions is met:
1. The value of **showSideBar** changes.
2. The **showSideBar** attribute adapts to behavior changes.
3. The **autoHide** API is triggered when the divider is dragged.| ## Example @@ -83,14 +104,13 @@ SideBarContainer( type?: SideBarContainerType ) @Entry @Component struct SideBarContainerExample { - normalIcon : Resource = $r("app.media.icon") + normalIcon: Resource = $r("app.media.icon") selectedIcon: Resource = $r("app.media.icon") @State arr: number[] = [1, 2, 3] @State current: number = 1 build() { - SideBarContainer(SideBarContainerType.Embed) - { + SideBarContainer(SideBarContainerType.Embed) { Column() { ForEach(this.arr, (item, index) => { Column({ space: 5 }) { @@ -115,6 +135,13 @@ struct SideBarContainerExample { } .margin({ top: 50, left: 20, right: 30 }) } + .controlButton({ + icons: { + hidden: $r('app.media.drawer'), + shown: $r('app.media.drawer'), + switching: $r('app.media.drawer') + } + }) .sideBarWidth(150) .minSideBarWidth(50) .maxSideBarWidth(300) diff --git a/en/application-dev/reference/arkui-ts/ts-container-swiper.md b/en/application-dev/reference/arkui-ts/ts-container-swiper.md index 2f224afc03..e3b26d289e 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-swiper.md +++ b/en/application-dev/reference/arkui-ts/ts-container-swiper.md @@ -11,6 +11,10 @@ This component can contain child components. +> **NOTE** +> +> Built-in components and custom components are allowed, with support for ([if/else](../../quick-start/arkts-rendering-control-ifelse.md), [ForEach](../../quick-start/arkts-rendering-control-foreach.md), and [LazyForEach](../../quick-start/arkts-rendering-control-lazyforeach.md)) rendering control. + ## APIs @@ -29,21 +33,23 @@ In addition to the [universal attributes](ts-universal-attributes-size.md), the | Name | Type | Description | | --------------------------- | ---------------------------------------- | ---------------------------------------- | -| index | number | Index of the child component currently displayed in the container.
Default value: **0** | -| autoPlay | boolean | Whether to enable automatic playback for child component switching.
Default value: **false** | +| index | number | Index of the child component currently displayed in the container.
Default value: **0**
**NOTE**
If the value is less than 0 or greater than or equal to the number of child components, the default value **0** is used.
Since API version 10, this attribute supports [$$](../../quick-start/arkts-two-way-sync.md) for two-way binding of variables.| +| autoPlay | boolean | Whether to enable automatic playback for child component switching.
Default value: **false**
**NOTE**
If **loop** is set to **false**, the playback stops when the last page is displayed. The playback continues when the page is not the last page after a swipe gesture.| | interval | number | Interval for automatic playback, in ms.
Default value: **3000** | -| indicator | boolean | Whether to enable the navigation dots indicator.
Default value: **true** | +| indicator10+ | [DotIndicator](#dotindicator) \| [DigitIndicator](#digitindicator) \| boolean | Style of the navigation point indicator.
\- **DotIndicator**: dot style.
\- **DigitIndicator**: digit style.
\- **boolean**: whether to enable the navigation point indicator.
Default value: **true**
Default type: **DotIndicator**| | loop | boolean | Whether to enable loop playback.
The value **true** means to enable loop playback. When LazyForEach is used, it is recommended that the number of the components to load exceed 5.
Default value: **true**| | duration | number | Duration of the animation for switching child components, in ms.
Default value: **400** | | vertical | boolean | Whether vertical swiping is used.
Default value: **false** | -| itemSpace | number \| string | Space between child components.
Default value: **0** | +| itemSpace | number \| string | Space between child components.
Default value: **0**
**NOTE**
This parameter cannot be set in percentage.| | displayMode | SwiperDisplayMode | Mode in which elements are displayed along the main axis. This attribute takes effect only when **displayCount** is not set.
Default value: **SwiperDisplayMode.Stretch**| | cachedCount8+ | number | Number of child components to be cached.
Default value: **1** | | disableSwipe8+ | boolean | Whether to disable the swipe feature.
Default value: **false** | | curve8+ | [Curve](ts-appendix-enums.md#curve) \| string | Animation curve. The ease-in/ease-out curve is used by default. For details about common curves, see [Curve](ts-appendix-enums.md#curve). You can also create custom curves (interpolation curve objects) by using the API provided by the [interpolation calculation](../apis/js-apis-curve.md) module.
Default value: **Curve.Ease**| -| indicatorStyle8+ | {
left?: [Length](ts-types.md#length),
top?: [Length](ts-types.md#length),
right?: [Length](ts-types.md#length),
bottom?: [Length](ts-types.md#length),
size?: [Length](ts-types.md#length),
mask?: boolean,
color?: [ResourceColor](ts-types.md),
selectedColor?: [ResourceColor](ts-types.md)
} | Style of the navigation dots indicator.
\- **left**: distance between the navigation dots indicator and the left edge of the **\** component.
\- **top**: distance between the navigation dots indicator and the top edge of the **\** component.
\- **right**: distance between the navigation dots indicator and the right edge of the **\** component.
\- **bottom**: distance between the navigation dots indicator and the bottom edge of the **\** component.
\- **size**: diameter of the navigation dots indicator.
\- **mask**: whether to enable the mask for the navigation dots indicator.
\- **color**: color of the navigation dots indicator.
\- **selectedColor**: color of the selected navigation dot.| -| displayCount8+ | number\|string | Number of elements to display per page.
Default value: **1** | -| effectMode8+ | [EdgeEffect](ts-appendix-enums.md#edgeeffect) | Swipe effect. For details, see **EdgeEffect**.
Default value: **EdgeEffect.Spring**| +| indicatorStyle8+ | {
left?: [Length](ts-types.md#length),
top?: [Length](ts-types.md#length),
right?: [Length](ts-types.md#length),
bottom?: [Length](ts-types.md#length),
size?: [Length](ts-types.md#length),
mask?: boolean,
color?: [ResourceColor](ts-types.md),
selectedColor?: [ResourceColor](ts-types.md)
} | Style of the navigation point indicator.
\- **left**: distance between the navigation point indicator and the left edge of the **\** component.
\- **top**: distance between the navigation point indicator and the top edge of the **\** component.
\- **right**: distance between the navigation point indicator and the right edge of the **\** component.
\- **bottom**: distance between the navigation point indicator and the bottom edge of the **\** component.
\- **size**: diameter of the navigation point indicator.
\- **mask**: whether to enable the mask for the navigation point indicator.
\- **color**: color of the navigation point indicator.
\- **selectedColor**: color of the selected navigation dot.| +| displayCount8+ | number\|string | Number of elements to display per page.
Default value: **1**
**NOTE**
If the value is of the string type, it can only be **'auto'**, whose display effect is the same as that of **SwiperDisplayMode.AutoLinear**.
If the value is of the number type, child components stretch (shrink) on the main axis after the swiper width [deducting the result of itemSpace x (displayCount – 1)] is evenly distributed among them on the main axis.| +| effectMode8+ | [EdgeEffect](ts-appendix-enums.md#edgeeffect) | Swipe effect. For details, see **EdgeEffect**.
Default value: **EdgeEffect.Spring**
**NOTE**
The spring effect does not take effect when the controller API is called.| +| nextMargin10+ |
[Length](ts-types.md#length)
| Next margin, used to reveal a small part of the next item.
Default value: **0**
**NOTE**
This parameter is valid only when **SwiperDisplayMode** is set to **STRETCH**. If **cachedCount** is set to a value less than or equal to 0, a small part of the next item is displayed, but child components cannot be loaded. | +| prevMargin10+ |
[Length](ts-types.md#length)
| Previous margin, used to reveal a small part of the previous item.
Default value: **0**
**NOTE**
This parameter is valid only when **SwiperDisplayMode** is set to **STRETCH**. If **cachedCount** is set to a value less than or equal to 0, a small part of the previous item is displayed, but child components cannot be loaded. | ## SwiperDisplayMode @@ -60,13 +66,13 @@ Controller of the **\** component. You can bind this object to the **\ void | No | Callback invoked when the animation stops.| -## Events +## Indicator10+ -### onChange +Sets the distance between the navigation point indicator and the **\** component. -onChange(event: (index: number) => void) +| Name| Type| Mandatory.| Description | +| ------ | -------- | ------ | ------------------------------------ | +| left | [Length](ts-types.md#length) | No | Distance between the navigation point indicator and the left edge of the **\** component.| +| top | [Length](ts-types.md#length) | No | Distance between the navigation point indicator and the top edge of the **\** component.| +| right | [Length](ts-types.md#length) | No | Distance between the navigation point indicator and the right edge of the **\** component.| +| bottom | [Length](ts-types.md#length) | No | Distance between the navigation point indicator and the bottom edge of the **\** component.| -Triggered when the index of the currently displayed child component changes. +### DotIndicator -> **NOTE** -> -> When the **\** component is used together with **LazyForEach**, the subpage UI cannot be refreshed in the **onChange** event. +Defines the navigation point indicator of the dot style, which inherits attributes and features from **Indicator**. + +| Name | Type | Mandatory.| Description | +| ------------------ | ------------- | ------ | ------------------------------------------------------ | +| itemWidth | [Length](ts-types.md#length) | No | Width of the navigation point indicator of the dot style.
Default value: **6**
Unit: vp| +| itemHeight | [Length](ts-types.md#length) | No | Height of the navigation point indicator of the dot style.
Default value: **6**
Unit: vp| +| selectedItemWidth | [Length](ts-types.md#length) | No | Width of the selected indicator dot.
Default value: **6**
Unit: vp| +| selectedItemHeight | [Length](ts-types.md#length) | No | Height of the selected indicator dot.
Default value: **6**
Unit: vp| +| mask | boolean | No | Whether to enable the mask for the navigation point indicator of the dot style.
Default value: **false**| +| color | [ResourceColor](ts-types.md#resourcecolor) | No | Color of the navigation point indicator of the dot style.
Default value: **'\#007DFF'**| +| selectedColor | [ResourceColor](ts-types.md#resourcecolor) | No | Color of the selected indicator dot.
Default value: **'\#182431'** (10% opacity)| -**Return value** +### DigitIndicator + +Defines the navigation point indicator of the digit style, which inherits attributes and features from **Indicator**. + +| Name | Type | Mandatory.| Description | +| ----------------- | ------------------------------------------------------------ | ------ | ------------------------------------------------------------ | +| fontColor | [ResourceColor](ts-types.md#resourcecolor) | No | Font color of the navigation point indicator of the digit style.
Default value: **'\#ff182431'**| +| selectedFontColor | [ResourceColor](ts-types.md#resourcecolor) | No | Font color of the selected indicator digit.
Default value: **'\#ff182431'**| +| digitFont | {
size?:[Length](ts-types.md#length)
weight?:number \| [FontWeight](ts-appendix-enums.md#fontweight) \| string
} | No | Font style of the navigation point indicator of the digit style.
\- **size**: font size.
Default value: **14vp**
\- **weight**: font weight.| +| selectedDigitFont | {
size?:[Length](ts-types.md#length)
weight?:number \| [FontWeight](ts-appendix-enums.md#fontweight) \| string
} | No | Font style of the selected indicator digit.
\- **size**: font size.
Default value: **14vp**
\- **weight**: font weight.| + +## Events -| Name | Type | Description| -| --------- | ---------- | -------- | -| index | number | Index of the currently displayed element.| +In addition to the [universal events](ts-universal-events-click.md), the following events are supported. +| Name | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| onChange(event: (index: number) => void) | Triggered when the index of the currently displayed child component changes.
- **index**: index of the currently displayed element.
**NOTE**
When the **\** component is used together with **LazyForEach**, the subpage UI update cannot be triggered in the **onChange** event.| +| onAnimationStart9+(event: (index: number) => void) | Triggered when the switching animation starts.
- **index**: index of the currently displayed element.
**NOTE**
The **index** parameter indicates the index before the animation starts (not the one after). When the **\** component contains multiple columns, the index is of the leftmost element.| +| onAnimationEnd9+(event: (index: number) => void) | Triggered when the switching animation ends.
- **index**: index of the currently displayed element.
**NOTE**
This event is triggered when the animation ends regardless of whether it is due to a user gesture or invocation of **finishAnimation** through **SwiperController**. The **index** parameter indicates the index after the animation ends. When the **\** component contains multiple columns, the index is of the leftmost element.| ## Example diff --git a/en/application-dev/reference/arkui-ts/ts-container-tabcontent.md b/en/application-dev/reference/arkui-ts/ts-container-tabcontent.md index 677690cdc8..e72c5eb5c4 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-tabcontent.md +++ b/en/application-dev/reference/arkui-ts/ts-container-tabcontent.md @@ -13,7 +13,7 @@ This component supports only one child component. > **NOTE** > -> System components and custom components can be built in, and rendering control types ([if/else](../../quick-start/arkts-rendering-control-ifelse.md), [ForEach](../../quick-start/arkts-rendering-control-foreach.md), and [LazyForEach](../../quick-start/arkts-rendering-control-lazyforeach.md)) are supported. +> Built-in components and custom components are allowed, with support for ([if/else](../../quick-start/arkts-rendering-control-ifelse.md), [ForEach](../../quick-start/arkts-rendering-control-foreach.md), and [LazyForEach](../../quick-start/arkts-rendering-control-lazyforeach.md)) rendering control. ## APIs @@ -28,7 +28,7 @@ In addition to the [universal attributes](ts-universal-attributes-size.md), the | Name| Type| Description| | -------- | -------- | -------- | | tabBar | string \| Resource \| {
icon?: string \| Resource,
text?: string \| Resource
}
\| [CustomBuilder](ts-types.md)8+ | Content displayed on the tab bar.
**CustomBuilder**: builder, to which components can be passed (applicable to API version 8 and later versions).
**NOTE**
If an icon uses an SVG image, the width and height attributes of the SVG image must be deleted. Otherwise, the icon size will be determined by the width and height attributes of the SVG image.
If the content set exceeds the space provided by the tab bar, it will be clipped.| -| tabBar9+ | [SubTabBarStyle](#subtabbarstyle9) \| [BottomTabBarStyle](#bottomtabbarstyle9) | Content displayed on the tab bar.
**SubTabBarStyle**: subtab style. It takes text as its input parameter.
**BottomTabBarStyle**: bottom and side tab style. It takes text and images as its input parameters.
**NOTE**
The bottom tab style does not include an underline.
When an icon display error occurs, a gray blank block is displayed.| +| tabBar9+ | [SubTabBarStyle](#subtabbarstyle) \| [BottomTabBarStyle](#bottomtabbarstyle) | Content displayed on the tab bar.
**SubTabBarStyle**: subtab style. It takes text as its input parameter.
**BottomTabBarStyle**: bottom and side tab style. It takes text and images as its input parameters.
**NOTE**
The bottom tab style does not include an underline.
When an icon display error occurs, a gray blank block is displayed.| > **NOTE** > diff --git a/en/application-dev/reference/arkui-ts/ts-container-tabs.md b/en/application-dev/reference/arkui-ts/ts-container-tabs.md index e33252888c..0acc1c38aa 100644 --- a/en/application-dev/reference/arkui-ts/ts-container-tabs.md +++ b/en/application-dev/reference/arkui-ts/ts-container-tabs.md @@ -18,11 +18,11 @@ Tabs(value?: {barPosition?: BarPosition, index?: number, controller?: [TabsContr **Parameters** -| Name | Type | Mandatory | Description | -| ----------- | --------------------------------- | ---- | ---------------------------------------- | -| barPosition | BarPosition | No | Position of the **\** component.
Default value: **BarPosition.Start** | -| index | number | No | Initial tab index.
Default value: **0**
**NOTE**
A value less than 0 evaluates to the default value.
The value ranges from 0 to the number of **\** subnodes minus 1.
When this parameter is set to different values, the slide animation for tab switching is enabled by default. To disable the animation, set **animationDuration** to **0**. | -| controller | [TabsController](#tabscontroller) | No | Tab controller. | +| Name | Type | Mandatory| Description | +| ----------- | --------------------------------- | ---- | ------------------------------------------------------------ | +| barPosition | BarPosition | No | Position of the **\** component.
Default value: **BarPosition.Start** | +| index | number | No | Initial tab index.
Default value: **0**
**NOTE**
A value less than 0 evaluates to the default value.
The value ranges from 0 to the number of **\** subnodes minus 1.
When this parameter is set to different values, the slide animation for tab switching is enabled by default. To disable the animation, set **animationDuration** to **0**.
Since API version 10, this parameter supports [$$](../../quick-start/arkts-two-way-sync.md) for two-way binding of variables.| +| controller | [TabsController](#tabscontroller) | No | Tab controller. | ## BarPosition @@ -42,7 +42,7 @@ In addition to the [universal attributes](ts-universal-attributes-size.md), the | scrollable | boolean | Whether the tabs are scrollable. The value **true** means that the tabs are scrollable, and **false** means the opposite.
Default value: **true**| | barMode | BarMode | Tab bar layout mode. For details, see **BarMode**.
Default value: **BarMode.Fixed**| | barWidth | number \| Length8+ | Width of the tab bar.
**NOTE**

A value less than 0 or greater than the width of the **\** component evaluates to the default value.| -| barHeight | number \| Length8+ | Height of the tab bar.
**NOTE**

A value less than 0 or greater than the width of the **\** component evaluates to the default value.| +| barHeight | number \| Length8+ | Height of the tab bar.
**NOTE**
A value less than 0 or greater than the width of the **\** component evaluates to the default value. | | animationDuration | number | Duration of the slide animation for tab switching. If this parameter is set, the tab switching animation is played when the user switches between tabs by sliding or clicking. If this parameter is not set, the tab switching animation is played only when the user switches between tabs by sliding.
Default value: **300**
**NOTE**
A value less than 0 or in percentage evaluates to the default value.| | divider10+ | [DividerStyle](#dividerstyle10) \| null | Whether the divider is displayed for the **\** and **\** components and the divider style. By default, the divider is not displayed.
**DividerStyle**: divider style.
**null**: The divider is not displayed.| | fadingEdge10+ | boolean | Whether the tab fades out when it exceeds the container width.
Default value: **true** | @@ -158,4 +158,3 @@ struct TabsExample { ``` ![tabs2](figures/tabs2.gif) - \ No newline at end of file diff --git a/en/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md b/en/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md index 0f15335b6b..343b5b8536 100644 --- a/en/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md +++ b/en/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md @@ -16,19 +16,19 @@ CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, aut **Parameters** -| Name | Type | Mandatory | Description | -| ---------------------- | ---------------------------------------- | ------------------------- | ---------------------- | -| builder | [CustomDialog](../../quick-start/arkts-dynamic-ui-elememt-building.md#customdialog) | Yes | Constructor of the custom dialog box content. | -| cancel | () => void | No | Callback invoked when the dialog box is closed after the overlay exits. | -| autoCancel | boolean | No | Whether to allow users to click the overlay to exit.
Default value: **true** | -| alignment | [DialogAlignment](ts-methods-alert-dialog-box.md#dialogalignment) | No | Alignment mode of the dialog box in the vertical direction.
Default value: **DialogAlignment.Default** | -| offset | [Offset](ts-types.md#offset) | No | Offset of the dialog box relative to the alignment position.| -| customStyle | boolean | No | Whether to use a custom style for the dialog box.
Default value: **false**, which means that the dialog box automatically adapts its width to the grid system and its height to the child components; the maximum height is 90% of the container height; the rounded corner is 24 vp. | -| gridCount8+ | number | No | Number of [grid columns](../../ui/ui-ts-layout-grid-container-new.md) occupied by the dialog box.
The default value is 4, and the maximum value is the maximum number of columns supported by the system. If this parameter is set to an invalid value, the default value is used.| -| maskColor10+ | [ResourceColor](ts-types.md#resourcecolor) | No | Custom mask color.
Default value: **0x33000000** | -| openAnimation10+ | [AnimateParam](ts-explicit-animation.md#animateparam) | No | Parameters for defining the open animation of the dialog box.
**NOTE**
If **iterations** is set to an odd number and **playMode** is set to **Reverse**, the dialog box will not be displayed when the animation ends. | -| closeAniamtion10+| [AnimateParam](ts-explicit-animation.md#animateparam) | No | Parameters for defining the close animation of the dialog box. | -| showInSubWindow10+| boolean | No | Whether to display a dialog box in a subwindow.
Default value: **false**, indicating that the dialog box is not displayed in the subwindow
**NOTE**
A dialog box whose **showInSubWindow** attribute is **true** cannot trigger the display of another dialog box whose **showInSubWindow** attribute is also **true**. | +| Name | Type | Mandatory | Description | +| ----------------------------- | ---------------------------------------- | ---- | ---------------------------------------- | +| builder | CustomDialog | Yes | Constructor of the custom dialog box content. | +| cancel | () => void | No | Callback invoked when the dialog box is closed after the overlay exits. | +| autoCancel | boolean | No | Whether to allow users to click the overlay to exit.
Default value: **true** | +| alignment | [DialogAlignment](ts-methods-alert-dialog-box.md#dialogalignment) | No | Alignment mode of the dialog box in the vertical direction.
Default value: **DialogAlignment.Default**| +| offset | [Offset](ts-types.md#offset) | No | Offset of the dialog box relative to the alignment position. | +| customStyle | boolean | No | Whether to use a custom style for the dialog box.
Default value: **false**, which means that the dialog box automatically adapts its width to the grid system and its height to the child components; the maximum height is 90% of the container height; the rounded corner is 24 vp.| +| gridCount8+ | number | No | Number of [grid columns](../../ui/arkts-layout-development-grid-layout.md) occupied by the dialog box.
The default value is 4, and the maximum value is the maximum number of columns supported by the system. If this parameter is set to an invalid value, the default value is used.| +| maskColor10+ | [ResourceColor](ts-types.md#resourcecolor) | No | Custom mask color.
Default value: **0x33000000** | +| openAnimation10+ | [AnimateParam](ts-explicit-animation.md#animateparam) | No | Parameters for defining the open animation of the dialog box.
**NOTE**
If **iterations** is set to an odd number and **playMode** is set to **Reverse**, the dialog box will not be displayed when the animation ends.| +| closeAniamtion10+ | [AnimateParam](ts-explicit-animation.md#animateparam) | No | Parameters for defining the close animation of the dialog box. | +| showInSubWindow10+ | boolean | No | Whether to display a dialog box in a subwindow.
Default value: **false**, indicating that the dialog box is not displayed in the subwindow
**NOTE**
A dialog box whose **showInSubWindow** attribute is **true** cannot trigger the display of another dialog box whose **showInSubWindow** attribute is also **true**.| ## CustomDialogController @@ -38,7 +38,7 @@ CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, aut dialogController : CustomDialogController = new CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, autoCancel?: boolean}) ``` > **NOTE** -> +> > **CustomDialogController** is valid only when it is a member variable of the **@CustomDialog** and **@Component** decorated struct and is defined in the **@Component** decorated struct. For details, see the following example. ### open() diff --git a/en/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md b/en/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md index e9f1c5c337..0e588d01fb 100644 --- a/en/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md +++ b/en/application-dev/reference/arkui-ts/ts-universal-attributes-popup.md @@ -10,45 +10,46 @@ You can bind a popup to a component, specifying its content, interaction logic, ## APIs -| Name | Type | Description | -| ---------- | ------------------------------------- | --------------------------------------- | -| bindPopup | show: boolean,
popup: [PopupOptions](#popupoptions) \| [CustomPopupOptions](#custompopupoptions8)8+ | Binds a popup to the component.
**show**: whether to show the popup. The default value is **false**, indicating that the popup is hidden.
**popup**: parameters of the popup.| +| Name | Type | Description | +| --------- | ---------------------------------------- | ---------------------------------------- | +| bindPopup | show: boolean,
popup: [PopupOptions](#popupoptions) \| [CustomPopupOptions](#custompopupoptions8)8+ | Binds a popup to the component.
**show**: whether to show the popup. The default value is **false**, indicating that the popup is hidden.
**popup**: parameters of the popup.| ## PopupOptions -| Name | Type | Mandatory | Description | -| -------------------------| ------------------------------------------------| -----| ----------------------------------------- | -| message | string | Yes | Content of the popup message. | -| placementOnTop | boolean | No | Whether to display the popup above the component.
Default value: **false** | -| primaryButton | {
value: string,
action: () => void
} | No | Primary button.
**value**: text of the primary button in the popup.
**action**: callback for clicking the primary button.| -| secondaryButton | {
value: string,
action: () => void
} | No | Secondary button.
**value**: text of the secondary button in the popup.
**action**: callback for clicking the secondary button.| -| onStateChange | (event: { isVisible: boolean }) => void | No | Callback for the popup status change event.
**isVisible**: whether the popup is visible. | -| arrowOffset9+ | [Length](ts-types.md#length) | No | Offset of the popup arrow relative to the popup.
When the arrow is at the top or bottom of the popup: The value **0** indicates that the arrow is located on the leftmost, and any other value indicates the distance from the arrow to the leftmost; the arrow is centered by default.
When the arrow is on the left or right side of the popup: The value indicates the distance from the arrow to the top; the arrow is centered by default.
When the popup is displayed on either edge of the screen, it will automatically deviate leftward or rightward to stay within the safe area. When the value is **0**, the arrow always points to the bound component. | -| showInSubWindow9+ | boolean | No | Whether to show the popup in the subwindow.
Default value: **false** | -| mask10+ | boolean \| [ResourceColor](ts-types.md#resourcecolor) | No | Whether to apply a mask to the popup. The value **true** means to apply a transparent mask to the popup, **false** means not to apply a mask to the popup, and a color value means to apply a mask in the corresponding color to the popup.| -| messageOptions10+ | [PopupMessageOptions](#popupmessageoptions10) | No | Parameters of the popup message.| -| targetSpace10+ | [Length](ts-types.md#length) | No | Space between the popup and the target.| +| Name | Type | Mandatory| Description | +| ------------------------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | +| message | string | Yes | Content of the popup message. | +| placementOnTop(deprecated) | boolean | No | Whether to display the popup above the component.
Default value: **false**
**NOTE**
This API is deprecated since API version 10. You are advised to use **placement** instead. | +| primaryButton | {
value: string,
action: () => void
} | No | Primary button.
**value**: text of the primary button in the popup.
**action**: callback for clicking the primary button.| +| secondaryButton | {
value: string,
action: () => void
} | No | Secondary button.
**value**: text of the secondary button in the popup.
**action**: callback for clicking the secondary button.| +| onStateChange | (event: { isVisible: boolean }) => void | No | Callback for the popup status change event.
**isVisible**: whether the popup is visible. | +| arrowOffset9+ | [Length](ts-types.md#length) | No | Offset of the popup arrow relative to the popup.
When the arrow is at the top or bottom of the popup: The value **0** indicates that the arrow is located on the leftmost, and any other value indicates the distance from the arrow to the leftmost; the arrow is centered by default.
When the arrow is on the left or right side of the popup: The value indicates the distance from the arrow to the top; the arrow is centered by default.
When the popup is displayed on either edge of the screen, it will automatically deviate leftward or rightward to stay within the safe area. When the value is **0**, the arrow always points to the bound component. | +| showInSubWindow9+ | boolean | No | Whether to show the popup in the subwindow.
Default value: **false** | +| mask10+ | boolean \| [ResourceColor](ts-types.md#resourcecolor) | No | Whether to apply a mask to the popup. The value **true** means to apply a transparent mask to the popup, **false** means not to apply a mask to the popup, and a color value means to apply a mask in the corresponding color to the popup.| +| messageOptions10+ | [PopupMessageOptions](#popupmessageoptions10) | No | Parameters of the popup message. | +| targetSpace10+ | [Length](ts-types.md#length) | No | Space between the popup and the target. | +| placement10+ | [Placement](ts-appendix-enums.md#placement8) | No | Position of the popup relative to the target. The default value is **Placement.Bottom**.
If both **placementOnTop** and **placement** are set, the latter prevails.| ## PopupMessageOptions10+ -| Name | Type | Mandatory| Description | -| --------- | ------------------------------------------ | ---- | ---------------------- | -| textColor | [ResourceColor](ts-types.md#resourcecolor) | No | Text color of the popup message.| -| font | [Font](ts-types.md#Font) | No | Font attributes of the popup message.| +| Name | Type | Mandatory | Description | +| --------- | ---------------------------------------- | ---- | ----------- | +| textColor | [ResourceColor](ts-types.md#resourcecolor) | No | Text color of the popup message.| +| font | [Font](ts-types.md#Font) | No | Font attributes of the popup message.| ## CustomPopupOptions8+ -| Name | Type | Mandatory | Description | -| -------------------------| ------------------------- | ---- | ---------------------------------------------------- | -| builder | [CustomBuilder](ts-types.md#custombuilder8) | Yes | Popup builder. | -| placement | [Placement](ts-appendix-enums.md#placement8) | No | Preferred position of the popup. If the set position is insufficient for holding the popup, it will be automatically adjusted.
Default value: **Placement.Bottom** | -| popupColor | [ResourceColor](ts-types.md#resourcecolor) | No | Color of the popup. | -| enableArrow | boolean | No | Whether to display an arrow.
Since API version 9, if the position set for the popup is not large enough, the arrow will not be displayed. For example, if **placement** is set to **Left**, but the popup height (80 vp) is less than the sum of the arrow width (32 vp) and diameter of popup rounded corner (48 vp), the arrow will not be displayed.
Default value: **true**| -| autoCancel | boolean | No | Whether to automatically close the popup when an operation is performed on the page.
Default value: **true** | -| onStateChange | (event: { isVisible: boolean }) => void | No | Callback for the popup status change event.
**isVisible**: whether the popup is visible. | -| arrowOffset9+ | [Length](ts-types.md#length) | No | Offset of the popup arrow relative to the popup.
When the arrow is at the top or bottom of the popup: The value **0** indicates that the arrow is located on the leftmost, and any other value indicates the distance from the arrow to the leftmost; the arrow is centered by default.
When the arrow is on the left or right side of the popup: The value indicates the distance from the arrow to the top; the arrow is centered by default.
When the popup is displayed on either edge of the screen, it will automatically deviate leftward or rightward to stay within the safe area. When the value is **0**, the arrow always points to the bound component. | -| showInSubWindow9+ | boolean | No | Whether to show the popup in the subwindow.
Default value: **false** | -| mask10+ | boolean \| [ResourceColor](ts-types.md#resourcecolor) | No| Whether to apply a mask to the popup. The value **true** means to apply a transparent mask to the popup, **false** means not to apply a mask to the popup, and a color value means to apply a mask in the corresponding color to the popup.| -| targetSpace10+ | [Length](ts-types.md#length) | No| Space between the popup and the target.| +| Name | Type | Mandatory | Description | +| ---------------------------- | ---------------------------------------- | ---- | ---------------------------------------- | +| builder | [CustomBuilder](ts-types.md#custombuilder8) | Yes | Popup builder. | +| placement | [Placement](ts-appendix-enums.md#placement8) | No | Preferred position of the popup. If the set position is insufficient for holding the popup, it will be automatically adjusted.
Default value: **Placement.Bottom**| +| popupColor | [ResourceColor](ts-types.md#resourcecolor) | No | Color of the popup. | +| enableArrow | boolean | No | Whether to display an arrow.
Since API version 9, if the position set for the popup is not large enough, the arrow will not be displayed. For example, if **placement** is set to **Left**, but the popup height (80 vp) is less than the sum of the arrow width (32 vp) and diameter of popup rounded corner (48 vp), the arrow will not be displayed.
Default value: **true**| +| autoCancel | boolean | No | Whether to automatically close the popup when an operation is performed on the page.
Default value: **true** | +| onStateChange | (event: { isVisible: boolean }) => void | No | Callback for the popup status change event.
**isVisible**: whether the popup is visible. | +| arrowOffset9+ | [Length](ts-types.md#length) | No | Offset of the popup arrow relative to the popup.
When the arrow is at the top or bottom of the popup: The value **0** indicates that the arrow is located on the leftmost, and any other value indicates the distance from the arrow to the leftmost; the arrow is centered by default.
When the arrow is on the left or right side of the popup: The value indicates the distance from the arrow to the top; the arrow is centered by default.
When the popup is displayed on either edge of the screen, it will automatically deviate leftward or rightward to stay within the safe area. When the value is **0**, the arrow always points to the bound component. | +| showInSubWindow9+ | boolean | No | Whether to show the popup in the subwindow. The default value is **false**. | +| mask10+ | boolean \| [ResourceColor](ts-types.md#resourcecolor) | No | Whether to apply a mask to the popup. The value **true** means to apply a transparent mask to the popup, **false** means not to apply a mask to the popup, and a color value means to apply a mask in the corresponding color to the popup.| +| targetSpace10+ | [Length](ts-types.md#length) | No | Space between the popup and the target. | ## Example ```ts @@ -111,7 +112,7 @@ struct PopupExample { .bindPopup(this.customPopup, { builder: this.popupBuilder, placement: Placement.Top, - mask: {color: 0x33000000}, + maskColor: '0x33000000', popupColor: Color.Yellow, enableArrow: true, showInSubWindow: false, diff --git a/en/application-dev/reference/arkui-ts/ts-universal-attributes-visibility.md b/en/application-dev/reference/arkui-ts/ts-universal-attributes-visibility.md index 7bf991c7db..ffe50fcf4f 100644 --- a/en/application-dev/reference/arkui-ts/ts-universal-attributes-visibility.md +++ b/en/application-dev/reference/arkui-ts/ts-universal-attributes-visibility.md @@ -10,7 +10,7 @@ The visibility attribute controls whether a component is visible. | Name | Type | Description | | ---------- | ---------------------------- | ------------------------------------------ | -| visibility | [Visibility](ts-appendix-enums.md#visibility) | Whether the component is visible. Note that even if a component is invisible, it still needs to be re-created when the page is refreshed. Therefore, you are advised to use [conditional rendering](../../quick-start/arkts-rendering-control.md#conditional-rendering) instead under scenarios where consistently high performance is required.
Default value: **Visibility.Visible**
Since API version 9, this API is supported in ArkTS widgets.| +| visibility | [Visibility](ts-appendix-enums.md#visibility) | Whether the component is visible. Note that even if a component is invisible, it still needs to be re-created when the page is refreshed. Therefore, you are advised to use [conditional rendering](../../quick-start/arkts-rendering-control-ifelse.md) instead under scenarios where consistently high performance is required.
Default value: **Visibility.Visible**
Since API version 9, this API is supported in ArkTS widgets.| ## Example @@ -23,11 +23,11 @@ struct VisibilityExample { build() { Column() { Column() { - // The component is hidden, and no placeholder is used. + // The component is hidden and does not take up space in the layout. Text('None').fontSize(9).width('90%').fontColor(0xCCCCCC) Row().visibility(Visibility.None).width('90%').height(80).backgroundColor(0xAFEEEE) - // The component is hidden, and a placeholder is used for it in the layout. + // The component is hidden but takes up space in the layout. Text('Hidden').fontSize(9).width('90%').fontColor(0xCCCCCC) Row().visibility(Visibility.Hidden).width('90%').height(80).backgroundColor(0xAFEEEE) diff --git a/en/application-dev/reference/arkui-ts/ts-universal-events-keyboardshortcut.md b/en/application-dev/reference/arkui-ts/ts-universal-events-keyboardshortcut.md new file mode 100644 index 0000000000..011fe91e02 --- /dev/null +++ b/en/application-dev/reference/arkui-ts/ts-universal-events-keyboardshortcut.md @@ -0,0 +1,121 @@ +# Custom Keyboard Shortcuts + +You can set one or more custom keyboard shortcuts for a component. The behavior of these keyboard shortcuts is the same as that of clicks. Components can respond to custom keyboard shortcuts even when they are not focused. + +> **NOTE** +> +> The APIs of this module are supported since API version 10. Updates will be marked with a superscript to indicate their earliest API version. + +## APIs + +keyboardShortcut(value: string | [FunctionKey], keys: Array<[ModifierKey]>) + +**Parameters** + +| Name| Type | Mandatory| Description | +| ------ | ------------------------------------- | ---- | ------------------------------------------------------------ | +| value | string \| [FunctionKey](#functionkey) | Yes | Character key (which can be entered through the keyboard) or [function key](#functionkey).
| +| keys | Array<[ModifierKey](#modifierkey)> | Yes | Modifier keys.
| + +## ModifierKey + +| Name | Description | +| ----- | ------------------- | +| CTRL | Ctrl key on the keyboard. | +| SHIFT | Shift key on the keyboard.| +| ALT | Alt key on the keyboard. | + +## FunctionKey + +| Name| Description | +| ---- | --------------------- | +| ESC | Esc key on the keyboard.| +| F1 | F1 key on the keyboard. | +| F2 | F2 key on the keyboard. | +| F3 | F3 key on the keyboard. | +| F4 | F4 key on the keyboard. | +| F5 | F5 key on the keyboard. | +| F6 | F6 key on the keyboard. | +| F7 | F7 key on the keyboard. | +| F8 | F8 key on the keyboard. | +| F9 | F9 key on the keyboard. | +| F10 | F10 key on the keyboard.| +| F11 | F11 key on the keyboard.| +| F12 | F12 key on the keyboard.| + +## Precautions for Using Keyboard Shortcuts + +| Scenario | Processing Logic | Example | +| ------------------------------------------------------------ | -------------------------------------------------------- | ------------------------------------------------------------ | +| All components that support the **onClick** event | Custom keyboard shortcuts are supported. | – | +| Requirements for custom keyboard shortcuts | A custom keyboard shortcut consists of one or more modifier keys (**Ctrl**, **Shift**, **Alt**, or any combination thereof) and a character key or function key.| Button('button1').keyboardShortcut('a',[ModifierKey.CTRL]) | +| Setting one custom keyboard shortcut for multiple components | Only the first component in the component tree responds to the custom keyboard shortcut. | Button('button1').keyboardShortcut('a',[ModifierKey.CTRL])
Button('button2').keyboardShortcut('a',[ModifierKey.CTRL]) | +| When the component is focused or not | The component responds to the custom keyboard shortcut as long as the window is focused. | – | +| When a single keyboard shortcut is set, it can be canceled by setting the **value**, **keys**, or both of them to null in the **keyboardShortcut** API.
When multiple keyboard shortcuts are set, they cannot be canceled.| Canceling the custom keyboard shortcut settings | Button('button1').keyboardShortcut('',[ModifierKey.CTRL])
Button('button2').keyboardShortcut('a',[l])
Button('button3').keyboardShortcut('',[]) | +| The independent pipeline sub-window and main window coexist | The focused window responds to the keyboard shortcut. | – | +| Ctrl, Shift, or Alt key in the **keys** parameter of the **keyboardShortcut** API | Both the keys on the left or right sides of the keyboard work. | Button('button1').keyboardShortcut('a',[ModifierKey.CTRL, ModifierKey.ALT]) | +| Character key in the **value** parameter of the **keyboardShortcut** API | The response is case-insensitive. | Button('button1').keyboardShortcut('a',[ModifierKey.CTRL])
Button('button2').keyboardShortcut('A',[ModifierKey.CTRL]) | +| Response to keyboard shortcuts | The component responds continuously to the keyboard shortcut when all the set keys are pressed. | – | +| Hidden component
| The keyboard shortcut also works. | – | +| Components in the disable state | The keyboard shortcut does not work. | – | +| 1. The keyboard shortcut is the same as an existing one (including the system-defined ones).
2. The **value** parameter contains multiple character keys.
3. The **key** parameter has a duplicate modifier key.| In these cases, the keyboard shortcut is not added, and the previously added keyboard shortcuts still work. | Button('button1').keyboardShortcut('c',[ModifierKey.CTRL])
Button('button2').keyboardShortcut('ab',[ModifierKey.CTRL])
Button('button3').keyboardShortcut('ab',[ModifierKey.CTRL,ModifierKey.CTRL]) | + +## System-defined Keyboard Shortcuts + +| Keyboard Shortcut | Component | +| -------------- | ------------------------------------------------------------ | +| Ctrl + C | [Image](ts-basic-components-image.md), [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Ctrl+ A | [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Ctrl+ V | [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Ctrl+ X | [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Shift + arrow keys| [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Ctrl+ Shift+ Z | [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Ctrl+ Z | [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Ctrl+ Y | [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Arrow keys and Enter key| [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| +| Tab key | [TextInput](ts-basic-components-textinput.md), [TextArea](ts-basic-components-textarea.md)| + +## Example + +Set a keyboard shortcut. You can then press the modifier key and accompanying key at the same time to trigger the component to respond to the shortcut and trigger the **onClick** event or other custom event. + +```ts +// xxx.ets +@Entry +@Component +struct Index { + @State message: string = 'Hello World' + + build() { + Row() { + Column() { + Text(this.message) + Button("Test short cut 1").onClick((event) => { + this.message = "I clicked Button 1"; + console.log("I clicked 1"); + }).keyboardShortcut('.', [ModifierKey.SHIFT, ModifierKey.CTRL, ModifierKey.ALT]) + .onKeyEvent((event)=>{ + console.log("event.keyCode: " + JSON.stringify(event)); + }) + Button("Test short cut 2").onClick((event) => { + this.message = "I clicked Button 2"; + console.log("I clicked 2"); + }).keyboardShortcut('1', [ModifierKey.CTRL]) + Button("Test short cut 3").onClick((event) => { + this.message = "I clicked Button 3"; + console.log("I clicked 3"); + }).keyboardShortcut('A', [ModifierKey.SHIFT]) + Button("Test short cut 4").onClick((event) => { + this.message = "I clicked Button 4"; + console.log("I clicked 4"); + }).keyboardShortcut(FunctionKey.F5, [], () => { + this.message = "I clicked Button 4"; + console.log("I clicked user callback."); + }).keyboardShortcut(FunctionKey.F3, []) + } + .width('100%') + } + .height('100%') + } +} +``` -- GitLab