• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
58```ts
59// xxx.ets
60@Entry
61@Component
62struct Index {
63  build() {
64    Row() {
65      Column() {
66        Text('This is gradient color.').textAlign(TextAlign.Center).height(50).width(200)
67          .borderImage({
68            source: {
69              angle: 90,
70              direction: GradientDirection.Left,
71              colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]]
72            },
73            slice: { top: 10, bottom: 10, left: 10, right: 10 },
74            width: { top: "10px", bottom: "10px", left: "10px", right: "10px" },
75            repeat: RepeatMode.Stretch,
76            fill: false
77          })
78      }
79      .width('100%')
80    }
81    .height('100%')
82  }
83}
84```
85
86![zh-cn_image_borderImageGradient](figures/borderImageGradient.png)
87
88### 示例2
89
90```ts
91// xxx.ets
92@Entry
93@Component
94struct BorderImage {
95  @State WidthValue: number = 0
96  @State SliceValue: number = 0
97  @State OutSetValue: number = 0
98  @State RepeatValue: RepeatMode[] = [RepeatMode.Repeat, RepeatMode.Stretch, RepeatMode.Round, RepeatMode.Space]
99  @State SelectIndex: number = 0
100  @State SelectText: string = 'Repeat'
101  @State FillValue: boolean = false
102
103  build() {
104    Row() {
105      Column({ space: 20 }) {
106        Row() {
107          Text('This is borderImage.').textAlign(TextAlign.Center).fontSize(50)
108        }
109        .borderImage({
110          source: $r('app.media.icon'),
111          slice: this.SliceValue,
112          width: this.WidthValue,
113          outset: this.OutSetValue,
114          repeat: this.RepeatValue[this.SelectIndex],
115          fill: this.FillValue
116        })
117
118        Column() {
119          Text(`borderImageSlice = ${this.SliceValue}px`)
120          Slider({
121            value: this.SliceValue,
122            min: 0,
123            max: 100,
124            style: SliderStyle.OutSet
125          })
126            .onChange((value: number, mode: SliderChangeMode) => {
127              this.SliceValue = value
128            })
129        }
130
131        Column() {
132          Text(`borderImageWidth = ${this.WidthValue}px`)
133          Slider({
134            value: this.WidthValue,
135            min: 0,
136            max: 100,
137            style: SliderStyle.OutSet
138          })
139            .onChange((value: number, mode: SliderChangeMode) => {
140              this.WidthValue = value
141            })
142        }
143
144        Column() {
145          Text(`borderImageOutSet = ${this.OutSetValue}px`)
146          Slider({
147            value: this.OutSetValue,
148            min: 0,
149            max: 100,
150            style: SliderStyle.OutSet
151          })
152            .onChange((value: number, mode: SliderChangeMode) => {
153              this.OutSetValue = value
154            })
155        }
156
157        Row() {
158          Text('borderImageRepeat: ')
159          Select([{ value: 'Repeat' }, { value: 'Stretch' }, { value: 'Round' }, { value: 'Space' }])
160            .value(this.SelectText)
161            .selected(this.SelectIndex)
162            .onSelect((index: number, value?: string) => {
163              this.SelectIndex = index
164              this.SelectText = value as string
165            })
166        }
167
168        Row() {
169          Text(`borderImageFill: ${this.FillValue} `)
170          Toggle({ type: ToggleType.Switch, isOn: this.FillValue })
171            .onChange((isOn: boolean) => {
172              this.FillValue = isOn
173            })
174        }
175
176      }
177      .width('100%')
178    }
179    .height('100%')
180  }
181}
182```
183
184![borderImage](figures/borderImage.gif)
185
186### 示例3
187
188```ts
189// xxx.ets
190// borderImage属性的slice、width、outset属性值使用LocalizedEdgeWidths类型
191
192import { LengthMetrics } from '@kit.ArkUI'
193
194@Entry
195@Component
196struct BorderImage {
197  @State WidthStartValue: number = 0
198  @State WidthEndValue: number = 0
199  @State SliceStartValue: number = 0
200  @State SliceEndValue: number = 0
201  @State OutSetStartValue: number = 0
202  @State OutSetEndValue: number = 0
203  @State RepeatValue: RepeatMode[] = [RepeatMode.Repeat, RepeatMode.Stretch, RepeatMode.Round, RepeatMode.Space]
204  @State SelectIndex: number = 0
205  @State SelectText: string = 'Repeat'
206  @State FillValue: boolean = false
207
208  build() {
209    Row() {
210      Column({ space: 20 }) {
211        Row() {
212          Text('This is borderImage.').textAlign(TextAlign.Center).fontSize(50)
213        }
214        .borderImage({
215          source: $r('app.media.icon'),
216          slice: {
217            top: LengthMetrics.px(10),
218            bottom: LengthMetrics.px(10),
219            start: LengthMetrics.px(this.SliceStartValue),
220            end: LengthMetrics.px(this.SliceEndValue) },
221          width: {
222            top: LengthMetrics.px(10),
223            bottom: LengthMetrics.px(10),
224            start: LengthMetrics.px(this.WidthStartValue),
225            end: LengthMetrics.px(this.WidthEndValue)
226          },
227          outset: {
228            top: LengthMetrics.px(10),
229            bottom: LengthMetrics.px(10),
230            start: LengthMetrics.px(this.OutSetStartValue),
231            end: LengthMetrics.px(this.OutSetEndValue)
232          },
233          repeat: this.RepeatValue[this.SelectIndex],
234          fill: this.FillValue
235        })
236
237        Column() {
238          Text(`borderImageSliceStart = ${this.SliceStartValue}px`)
239          Slider({
240            value: this.SliceStartValue,
241            min: 0,
242            max: 100,
243            style: SliderStyle.OutSet
244          })
245            .onChange((value: number, mode: SliderChangeMode) => {
246              this.SliceStartValue = value
247            })
248        }
249
250        Column() {
251          Text(`borderImageEndSliceStart = ${this.SliceEndValue}px`)
252          Slider({
253            value: this.SliceEndValue,
254            min: 0,
255            max: 100,
256            style: SliderStyle.OutSet
257          })
258            .onChange((value: number, mode: SliderChangeMode) => {
259              this.SliceEndValue = value
260            })
261        }
262
263        Column() {
264          Text(`borderImageWidthStart = ${this.WidthStartValue}px`)
265          Slider({
266            value: this.WidthStartValue,
267            min: 0,
268            max: 100,
269            style: SliderStyle.OutSet
270          })
271            .onChange((value: number, mode: SliderChangeMode) => {
272              this.WidthStartValue = value
273            })
274        }
275
276        Column() {
277          Text(`borderImageWidthEnd = ${this.WidthEndValue}px`)
278          Slider({
279            value: this.WidthEndValue,
280            min: 0,
281            max: 100,
282            style: SliderStyle.OutSet
283          })
284            .onChange((value: number, mode: SliderChangeMode) => {
285              this.WidthEndValue = value
286            })
287        }
288
289        Column() {
290          Text(`borderImageOutSetStart = ${this.OutSetStartValue}px`)
291          Slider({
292            value: this.OutSetStartValue,
293            min: 0,
294            max: 100,
295            style: SliderStyle.OutSet
296          })
297            .onChange((value: number, mode: SliderChangeMode) => {
298              this.OutSetStartValue = value
299            })
300        }
301
302        Column() {
303          Text(`borderImageOutSetEnd = ${this.OutSetEndValue}px`)
304          Slider({
305            value: this.OutSetEndValue,
306            min: 0,
307            max: 100,
308            style: SliderStyle.OutSet
309          })
310            .onChange((value: number, mode: SliderChangeMode) => {
311              this.OutSetEndValue = value
312            })
313        }
314
315        Row() {
316          Text('borderImageRepeat: ')
317          Select([{ value: 'Repeat' }, { value: 'Stretch' }, { value: 'Round' }, { value: 'Space' }])
318            .value(this.SelectText)
319            .selected(this.SelectIndex)
320            .onSelect((index: number, value?: string) => {
321              this.SelectIndex = index
322              this.SelectText = value as string
323            })
324        }
325
326        Row() {
327          Text(`borderImageFill: ${this.FillValue} `)
328          Toggle({ type: ToggleType.Switch, isOn: this.FillValue })
329            .onChange((isOn: boolean) => {
330              this.FillValue = isOn
331            })
332        }
333
334      }
335      .width('100%')
336    }
337    .height('100%')
338  }
339}
340```
341
342从左至右显示语言示例图
343
344![borderImage](figures/borderImage_ltr.png)
345
346从右至左显示语言示例图
347
348![borderImage](figures/borderImage_rtl.png)