1# 图片边框设置
2
3设置组件的图片边框样式。
4
5>  **说明:**
6>
7>  从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9## borderImage
10
11borderImage(value: BorderImageOption)
12
13设置组件的图片边框。
14
15**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
16
17**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
18
19**系统能力:** SystemCapability.ArkUI.ArkUI.Full
20
21**参数:**
22
23| 参数名      | 类型                                            | 必填 | 描述                             |
24| ----------- | ----------------------------------------------- | ---- | -------------------------------- |
25| value | [BorderImageOption](#borderimageoption对象说明) | 是   | 图片边框或者渐变色边框设置接口。 |
26
27## BorderImageOption对象说明
28
29**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
30
31| 名称   | 类型                                                         | 必填| 描述                                                         |
32| ------ | ------------------------------------------------------------ | ---- |  ------------------------------------------------------------ |
33| source | string \| [Resource](ts-types.md#resource) \| [linearGradient](ts-universal-attributes-gradient-color.md) | 否 | 边框图源或者渐变色设置。<br/>**说明:**<br>边框图源仅适用于容器组件,如[Row](ts-container-row.md)、[Column](ts-container-column.md)、[Flex](ts-container-flex.md),在非容器组件上使用会失效。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
34| slice  | [Length](ts-types.md#length) \| [EdgeWidths](ts-types.md#edgewidths9)  \| [LocalizedEdgeWidths](ts-types.md#localizededgewidths12)<sup>12+</sup>| 否 | 设置边框图片左上角、右上角、左下角以及右下角的切割宽度。<br/>默认值:0<br/>**说明:**<br/>设置负数时取默认值。<br/>参数类型为[Length](ts-types.md#length)时,统一设置四个角的宽高。<br/>参数类型为[EdgeWidths](ts-types.md#edgewidths9)时:<br/>-&nbsp;Top:设置图片左上角或者右上角被切割的高。<br/>-&nbsp;Bottom:设置图片左下角或者右下角被切割的高。<br/>-&nbsp;Left:设置图片左上角或者左下角被切割的宽。<br/>-&nbsp;Right:设置图片右上角或者右下角被切割的宽。 <br/>参数类型为[LocalizedEdgeWidths](ts-types.md#localizededgewidths12)<sup>12+</sup>时:<br/>-&nbsp;Top:设置图片左上角或者右上角被切割的高。<br/>-&nbsp;Bottom:设置图片左下角或者右下角被切割的高。<br/>-&nbsp;Start:设置图片左上角或者左下角被切割的宽。<br />从右至左显示语言模式下为设置图片右上角或者右下角被切割的宽。<br/>-&nbsp;End:设置图片右上角或者右下角被切割的宽。 从右至左显示语言模式下为设置图片左上角或者左下角被切割的宽。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
35| width  | [Length](ts-types.md#length) \| [EdgeWidths](ts-types.md#edgewidths9) \| [LocalizedEdgeWidths](ts-types.md#localizededgewidths12)<sup>12+</sup> | 否| 设置图片边框宽度。<br/>默认值:0<br/>**说明:**<br/>参数类型为[Length](ts-types.md#length)时,统一设置四个角的宽高,设置负数时取默认值。<br/>参数类型为[EdgeWidths](ts-types.md#edgewidths9)时:<br/>-&nbsp;Top:设置图片边框上边框的宽。<br/>-&nbsp;Bottom:设置图片边框下边框的宽。<br/>-&nbsp;Left:设置图片边框左边框的宽。<br/>-&nbsp;Right:设置图片边框右边框宽。<br/>参数类型为[LocalizedEdgeWidths](ts-types.md#localizededgewidths12)<sup>12+</sup>时:<br/>-&nbsp;Top:设置图片边框上边框的宽。<br/>-&nbsp;Bottom:设置图片边框下边框的宽。<br/>-&nbsp;Start:设置图片边框左边框的宽。<br />从右至左显示语言模式下为设置图片边框右边框宽。<br/>-&nbsp;End:设置图片边框右边框宽。<br />从右至左显示语言模式下为设置图片边框左边框的宽。<br/>设置负数时值取1。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
36| outset | [Length](ts-types.md#length) \| [EdgeWidths](ts-types.md#edgewidths9) \| [LocalizedEdgeWidths](ts-types.md#localizededgewidths12)<sup>12+</sup> | 否 | 设置边框图片向外延伸距离。<br/>默认值:0<br/>**说明:**<br/>设置负数时取默认值。<br/>参数类型为[Length](ts-types.md#length)时,统一设置四个角的宽高。<br/>参数类型为[EdgeWidths](ts-types.md#edgewidths9)时:<br/>-&nbsp;Top:设置边框图片上边框向外延伸的距离。<br/>-&nbsp;Bottom:设置边框图片下边框向外延伸的距离。<br/>-&nbsp;Left:设置边框图片左边框向外延伸的距离。<br/>-&nbsp;Right:设置边框图片右边框向外延伸的距离。<br/>参数类型为[LocalizedEdgeWidths](ts-types.md#localizededgewidths12)<sup>12+</sup>时:<br/>-&nbsp;Top:设置边框图片上边框向外延伸的距离。<br/>-&nbsp;Bottom:设置边框图片下边框向外延伸的距离。<br/>-&nbsp;Start:设置边框图片左边框向外延伸的距离。<br/>从右至左显示语言模式下为设置边框图片右边框向外延伸的距离。<br/>-&nbsp;End:设置边框图片右边框向外延伸的距离。<br/>从右至左显示语言模式下为设置边框图片左边框向外延伸的距离。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
37| repeat | [RepeatMode](#repeatmode枚举说明)                            | 否 | 设置被切割的图片在边框上的重复方式。<br/>默认值:RepeatMode.Stretch<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
38| fill   | boolean                                                      | 否 | 设置边框图片是否中心填充。<br/>默认值:false<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                     |
39
40## RepeatMode枚举说明
41
42**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
43
44**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
45
46| 名称      | 描述                                  |
47| ------- | ----------------------------------- |
48| Repeat  | 被切割图片重复铺平在图片边框上,超出的部分会被剪裁。          |
49| Stretch | 被切割图片以拉伸填充的方式铺满图片边框。                |
50| Round   | 被切割图片以整数次平铺在图片边框上,无法以整数次平铺时压缩被切割图片。 |
51| Space   | 被切割图片以整数次平铺在图片边框上,无法以整数次平铺时以空白填充。   |
52
53## 示例
54
55### 示例1(设置渐变色边框)
56
57通过borderImage接口为组件设置渐变色边框。
58
59```ts
60// xxx.ets
61@Entry
62@Component
63struct Index {
64  build() {
65    Row() {
66      Column() {
67        Text('This is gradient color.').textAlign(TextAlign.Center).height(50).width(200)
68          .borderImage({
69            source: {
70              angle: 90,
71              direction: GradientDirection.Left,
72              colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]]
73            },
74            slice: { top: 10, bottom: 10, left: 10, right: 10 },
75            width: { top: "10px", bottom: "10px", left: "10px", right: "10px" },
76            repeat: RepeatMode.Stretch,
77            fill: false
78          })
79      }
80      .width('100%')
81    }
82    .height('100%')
83  }
84}
85```
86
87![zh-cn_image_borderImageGradient](figures/borderImageGradient.png)
88
89### 示例2(动态调整属性值)
90
91通过[slider](../../apis-arkui/arkui-js/js-components-basic-slider.md)接口动态调整borderImage接口中属性值。
92
93```ts
94// xxx.ets
95@Entry
96@Component
97struct BorderImage {
98  @State WidthValue: number = 0
99  @State SliceValue: number = 0
100  @State OutSetValue: number = 0
101  @State RepeatValue: RepeatMode[] = [RepeatMode.Repeat, RepeatMode.Stretch, RepeatMode.Round, RepeatMode.Space]
102  @State SelectIndex: number = 0
103  @State SelectText: string = 'Repeat'
104  @State FillValue: boolean = false
105
106  build() {
107    Row() {
108      Column({ space: 20 }) {
109        Row() {
110          Text('This is borderImage.').textAlign(TextAlign.Center).fontSize(50)
111        }
112        .borderImage({
113          source: $r('app.media.icon'),
114          slice: this.SliceValue,
115          width: this.WidthValue,
116          outset: this.OutSetValue,
117          repeat: this.RepeatValue[this.SelectIndex],
118          fill: this.FillValue
119        })
120
121        Column() {
122          Text(`borderImageSlice = ${this.SliceValue}px`)
123          Slider({
124            value: this.SliceValue,
125            min: 0,
126            max: 100,
127            style: SliderStyle.OutSet
128          })
129            .onChange((value: number, mode: SliderChangeMode) => {
130              this.SliceValue = value
131            })
132        }
133
134        Column() {
135          Text(`borderImageWidth = ${this.WidthValue}px`)
136          Slider({
137            value: this.WidthValue,
138            min: 0,
139            max: 100,
140            style: SliderStyle.OutSet
141          })
142            .onChange((value: number, mode: SliderChangeMode) => {
143              this.WidthValue = value
144            })
145        }
146
147        Column() {
148          Text(`borderImageOutSet = ${this.OutSetValue}px`)
149          Slider({
150            value: this.OutSetValue,
151            min: 0,
152            max: 100,
153            style: SliderStyle.OutSet
154          })
155            .onChange((value: number, mode: SliderChangeMode) => {
156              this.OutSetValue = value
157            })
158        }
159
160        Row() {
161          Text('borderImageRepeat: ')
162          Select([{ value: 'Repeat' }, { value: 'Stretch' }, { value: 'Round' }, { value: 'Space' }])
163            .value(this.SelectText)
164            .selected(this.SelectIndex)
165            .onSelect((index: number, value?: string) => {
166              this.SelectIndex = index
167              this.SelectText = value as string
168            })
169        }
170
171        Row() {
172          Text(`borderImageFill: ${this.FillValue} `)
173          Toggle({ type: ToggleType.Switch, isOn: this.FillValue })
174            .onChange((isOn: boolean) => {
175              this.FillValue = isOn
176            })
177        }
178
179      }
180      .width('100%')
181    }
182    .height('100%')
183  }
184}
185```
186
187![borderImage](figures/borderImage.gif)
188
189### 示例3(使用LocalizedEdgeWidths类型值)
190
191borderImage接口中的slice、width、outset属性值使用[LocalizedEdgeWidths](ts-types.md#localizededgewidths12)类型。
192
193```ts
194// xxx.ets
195import { LengthMetrics } from '@kit.ArkUI'
196
197@Entry
198@Component
199struct BorderImage {
200  @State WidthStartValue: number = 0
201  @State WidthEndValue: number = 0
202  @State SliceStartValue: number = 0
203  @State SliceEndValue: number = 0
204  @State OutSetStartValue: number = 0
205  @State OutSetEndValue: number = 0
206  @State RepeatValue: RepeatMode[] = [RepeatMode.Repeat, RepeatMode.Stretch, RepeatMode.Round, RepeatMode.Space]
207  @State SelectIndex: number = 0
208  @State SelectText: string = 'Repeat'
209  @State FillValue: boolean = false
210
211  build() {
212    Row() {
213      Column({ space: 20 }) {
214        Row() {
215          Text('This is borderImage.').textAlign(TextAlign.Center).fontSize(50)
216        }
217        .borderImage({
218          source: $r('app.media.icon'),
219          slice: {
220            top: LengthMetrics.px(10),
221            bottom: LengthMetrics.px(10),
222            start: LengthMetrics.px(this.SliceStartValue),
223            end: LengthMetrics.px(this.SliceEndValue) },
224          width: {
225            top: LengthMetrics.px(10),
226            bottom: LengthMetrics.px(10),
227            start: LengthMetrics.px(this.WidthStartValue),
228            end: LengthMetrics.px(this.WidthEndValue)
229          },
230          outset: {
231            top: LengthMetrics.px(10),
232            bottom: LengthMetrics.px(10),
233            start: LengthMetrics.px(this.OutSetStartValue),
234            end: LengthMetrics.px(this.OutSetEndValue)
235          },
236          repeat: this.RepeatValue[this.SelectIndex],
237          fill: this.FillValue
238        })
239
240        Column() {
241          Text(`borderImageSliceStart = ${this.SliceStartValue}px`)
242          Slider({
243            value: this.SliceStartValue,
244            min: 0,
245            max: 100,
246            style: SliderStyle.OutSet
247          })
248            .onChange((value: number, mode: SliderChangeMode) => {
249              this.SliceStartValue = value
250            })
251        }
252
253        Column() {
254          Text(`borderImageEndSliceStart = ${this.SliceEndValue}px`)
255          Slider({
256            value: this.SliceEndValue,
257            min: 0,
258            max: 100,
259            style: SliderStyle.OutSet
260          })
261            .onChange((value: number, mode: SliderChangeMode) => {
262              this.SliceEndValue = value
263            })
264        }
265
266        Column() {
267          Text(`borderImageWidthStart = ${this.WidthStartValue}px`)
268          Slider({
269            value: this.WidthStartValue,
270            min: 0,
271            max: 100,
272            style: SliderStyle.OutSet
273          })
274            .onChange((value: number, mode: SliderChangeMode) => {
275              this.WidthStartValue = value
276            })
277        }
278
279        Column() {
280          Text(`borderImageWidthEnd = ${this.WidthEndValue}px`)
281          Slider({
282            value: this.WidthEndValue,
283            min: 0,
284            max: 100,
285            style: SliderStyle.OutSet
286          })
287            .onChange((value: number, mode: SliderChangeMode) => {
288              this.WidthEndValue = value
289            })
290        }
291
292        Column() {
293          Text(`borderImageOutSetStart = ${this.OutSetStartValue}px`)
294          Slider({
295            value: this.OutSetStartValue,
296            min: 0,
297            max: 100,
298            style: SliderStyle.OutSet
299          })
300            .onChange((value: number, mode: SliderChangeMode) => {
301              this.OutSetStartValue = value
302            })
303        }
304
305        Column() {
306          Text(`borderImageOutSetEnd = ${this.OutSetEndValue}px`)
307          Slider({
308            value: this.OutSetEndValue,
309            min: 0,
310            max: 100,
311            style: SliderStyle.OutSet
312          })
313            .onChange((value: number, mode: SliderChangeMode) => {
314              this.OutSetEndValue = value
315            })
316        }
317
318        Row() {
319          Text('borderImageRepeat: ')
320          Select([{ value: 'Repeat' }, { value: 'Stretch' }, { value: 'Round' }, { value: 'Space' }])
321            .value(this.SelectText)
322            .selected(this.SelectIndex)
323            .onSelect((index: number, value?: string) => {
324              this.SelectIndex = index
325              this.SelectText = value as string
326            })
327        }
328
329        Row() {
330          Text(`borderImageFill: ${this.FillValue} `)
331          Toggle({ type: ToggleType.Switch, isOn: this.FillValue })
332            .onChange((isOn: boolean) => {
333              this.FillValue = isOn
334            })
335        }
336
337      }
338      .width('100%')
339    }
340    .height('100%')
341  }
342}
343```
344
345从左至右显示语言示例图
346
347![borderImage](figures/borderImage_ltr.png)
348
349从右至左显示语言示例图
350
351![borderImage](figures/borderImage_rtl.png)