1# @ohos.arkui.drawableDescriptor (DrawableDescriptor)
2
3本模块提供获取pixelMap的能力,包括前景、背景、蒙版和分层图标。
4
5> **说明:**
6>
7> 本模块首批接口从API version 10开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8>
9> 示例效果请以真机运行为准,当前DevEco Studio预览器不支持。
10
11## 导入模块
12
13```ts
14import { DrawableDescriptor, LayeredDrawableDescriptor } from '@kit.ArkUI';
15```
16
17## DrawableDescriptor
18
19支持传入png,jpg,bmp,svg,gif,webp,astc,sut格式的资源类型。
20
21### getPixelMap
22
23getPixelMap(): image.PixelMap
24
25获取pixelMap。
26
27**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
28
29**系统能力:** SystemCapability.ArkUI.ArkUI.Full
30
31**返回值:**
32
33| 类型                                       | 说明       |
34| ---------------------------------------- | -------- |
35| [image.PixelMap](../apis-image-kit/js-apis-image.md#pixelmap7) | PixelMap |
36
37**示例:**
38  ```ts
39import { DrawableDescriptor, LayeredDrawableDescriptor } from '@kit.ArkUI'
40let resManager = getContext().resourceManager
41let pixmap: DrawableDescriptor = (resManager.getDrawableDescriptor($r('app.media.icon')
42    .id)) as DrawableDescriptor;
43let pixmapNew: object = pixmap.getPixelMap()
44  ```
45
46当传入资源id或name为普通图片时,生成DrawableDescriptor对象。
47
48## PixelMapDrawableDescriptor<sup>12+</sup>
49
50支持通过传入pixelMap创建PixelMapDrawableDescriptor对象。继承自[DrawableDescriptor](#drawabledescriptor)。
51
52### constructor<sup>12+</sup>
53
54constructor(src?: image.PixelMap)
55
56PixelMapDrawableDescriptor的构造函数。
57
58**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
59
60**系统能力:** SystemCapability.ArkUI.ArkUI.Full
61
62**参数:**
63
64| 参数名     | 类型              | 必填  | 说明                                       |
65| --------- | ---------------- | ---- | ------------------------------------------ |
66| src | [image.PixelMap](../apis-image-kit/js-apis-image.md#pixelmap7)  | 否 | PixelMap类型参数,存储 PixelMap 图片数据。 |
67
68
69## LayeredDrawableDescriptor
70
71当传入资源id或name为包含前景和背景资源的json文件时,生成LayeredDrawableDescriptor对象。继承自[DrawableDescriptor](#drawabledescriptor)。
72
73drawable.json位于项目工程entry/src/main/resources/base/media目录下。定义请参考:
74
75```json
76{
77  "layered-image":
78  {
79    "background" : "$media:background",
80    "foreground" : "$media:foreground"
81  }
82}
83```
84
85**示例:**
86
871. 通过json文件创建LayeredDrawableDescriptor。
88
89    ```ts
90    // xxx.ets
91    import { DrawableDescriptor, LayeredDrawableDescriptor } from '@kit.ArkUI'
92
93    @Entry
94    @Component
95    struct Index {
96      private resManager = getContext().resourceManager
97
98      build() {
99        Row() {
100          Column() {
101            Image((this.resManager.getDrawableDescriptor($r('app.media.drawable').id) as LayeredDrawableDescriptor))
102            Image(((this.resManager.getDrawableDescriptor($r('app.media.drawable')
103            .id) as LayeredDrawableDescriptor).getForeground()).getPixelMap())
104          }.height('50%')
105        }.width('50%')
106      }
107    }
108    ```
1092. 通过PixelMapDrawableDescriptor创建LayeredDrawableDescriptor。
110
111    ```ts
112    import { DrawableDescriptor, LayeredDrawableDescriptor, PixelMapDrawableDescriptor } from '@kit.ArkUI'
113    import { image } from '@kit.ImageKit'
114
115    @Entry
116    @Component
117    struct Index {
118      @State fore1: image.PixelMap | undefined = undefined
119      @State back1: image.PixelMap | undefined = undefined
120
121      @State foregroundDraw:DrawableDescriptor|undefined=undefined
122      @State backgroundDraw:DrawableDescriptor|undefined=undefined
123      @State maskDraw:DrawableDescriptor|undefined=undefined
124      @State maskPixel: image.PixelMap | undefined = undefined
125      @State draw : LayeredDrawableDescriptor | undefined = undefined
126      async aboutToAppear() {
127        this.fore1 = await this.getPixmapFromMedia($r('app.media.foreground'))
128        this.back1 = await this.getPixmapFromMedia($r('app.media.background'))
129        this.maskPixel = await this.getPixmapFromMedia($r('app.media.ohos_icon_mask'))
130        // 使用PixelMapDrawableDescriptor创建LayeredDrawableDescriptor
131        this.foregroundDraw = new PixelMapDrawableDescriptor(this.fore1)
132        this.backgroundDraw = new PixelMapDrawableDescriptor(this.back1)
133        this.maskDraw = new PixelMapDrawableDescriptor(this.maskPixel)
134
135        this.draw = new LayeredDrawableDescriptor(this.foregroundDraw,this.backgroundDraw,this.maskDraw)
136      }
137      build() {
138        Row() {
139          Column() {
140              Image(this.draw)
141                .width(300)
142                .height(300)
143          }.height('100%').justifyContent(FlexAlign.Center)
144        }.width('100%').height("100%").backgroundColor(Color.Pink)
145      }
146      // 根据资源,通过图片框架获取pixelMap
147      private async getPixmapFromMedia(resource: Resource) {
148        let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({
149          bundleName: resource.bundleName,
150          moduleName: resource.moduleName,
151          id: resource.id
152        })
153        let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength))
154        let createPixelMap: image.PixelMap = await imageSource.createPixelMap({
155          desiredPixelFormat: image.PixelMapFormat.BGRA_8888
156        })
157        await imageSource.release()
158        return createPixelMap
159      }
160    }
161    ```
162
163### constructor<sup>12+</sup>
164
165constructor(foreground?: DrawableDescriptor, background?: DrawableDescriptor, mask?: DrawableDescriptor);
166
167LayeredDrawableDescriptor的构造函数。
168
169**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
170
171**系统能力:** SystemCapability.ArkUI.ArkUI.Full
172
173**参数:**
174
175| 参数名     | 类型              | 必填  | 说明                                       |
176| --------- | ---------------- | ---- | ------------------------------------------ |
177| foreground | [DrawableDescriptor](#drawabledescriptor)  | 否   | 分层图标的前景图片选项。 |
178| background   | [DrawableDescriptor](#drawabledescriptor) | 否   | 分层图标的背景图片选项。  |
179| mask | [DrawableDescriptor](#drawabledescriptor) | 否 | 分层图标的遮罩选项。 |
180
181### getForeground
182getForeground(): DrawableDescriptor;
183
184获取前景的DrawableDescriptor对象。
185
186**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
187
188**系统能力:** SystemCapability.ArkUI.ArkUI.Full
189
190**返回值:**
191
192| 类型                                       | 说明                   |
193| ---------------------------------------- | -------------------- |
194| [DrawableDescriptor](#drawabledescriptor) | DrawableDescriptor对象。 |
195
196**示例:**
197  ```ts
198import { DrawableDescriptor, LayeredDrawableDescriptor } from '@kit.ArkUI'
199let resManager = getContext().resourceManager
200let drawable: LayeredDrawableDescriptor = (resManager.getDrawableDescriptor($r('app.media.drawable')
201    .id)) as LayeredDrawableDescriptor;
202let drawableNew: object = drawable.getForeground()
203  ```
204
205### getBackground
206
207getBackground(): DrawableDescriptor;
208
209获取背景的DrawableDescriptor对象。
210
211**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
212
213**系统能力:** SystemCapability.ArkUI.ArkUI.Full
214
215**返回值:**
216
217| 类型                                       | 说明                   |
218| ---------------------------------------- | -------------------- |
219| [DrawableDescriptor](#drawabledescriptor) | DrawableDescriptor对象。 |
220
221**示例:**
222  ```ts
223import { DrawableDescriptor, LayeredDrawableDescriptor } from '@kit.ArkUI'
224let resManager = getContext().resourceManager
225let drawable: LayeredDrawableDescriptor = (resManager.getDrawableDescriptor($r('app.media.drawable')
226    .id)) as LayeredDrawableDescriptor;
227let drawableNew: object = drawable.getBackground()
228  ```
229
230### getMask
231
232getMask(): DrawableDescriptor
233
234获取蒙版的DrawableDescriptor对象。
235
236**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
237
238**系统能力:** SystemCapability.ArkUI.ArkUI.Full
239
240**返回值:**
241
242| 类型                                       | 说明                   |
243| ---------------------------------------- | -------------------- |
244| [DrawableDescriptor](#drawabledescriptor) | DrawableDescriptor对象。 |
245
246**示例:**
247  ```ts
248import { DrawableDescriptor, LayeredDrawableDescriptor } from '@kit.ArkUI'
249let resManager = getContext().resourceManager
250let drawable: LayeredDrawableDescriptor = (resManager.getDrawableDescriptor($r('app.media.drawable')
251    .id)) as LayeredDrawableDescriptor;
252let drawableNew: object = drawable.getMask()
253  ```
254### getMaskClipPath
255
256static getMaskClipPath(): string
257
258LayeredDrawableDescriptor的静态方法,获取系统内置的裁切路径参数。
259
260**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
261
262**系统能力:** SystemCapability.ArkUI.ArkUI.Full
263
264**返回值:**
265
266| 类型                                       | 说明                   |
267| ---------------------------------------- | -------------------- |
268| string | 返回裁切路径的命令字符串。 |
269
270**示例:**
271
272  ```ts
273// xxx.ets
274import { DrawableDescriptor, LayeredDrawableDescriptor } from '@kit.ArkUI'
275
276@Entry
277@Component
278struct Index {
279  build() {
280    Row() {
281      Column() {
282        Image($r('app.media.icon'))
283          .width('200px').height('200px')
284          .clipShape(new Path({commands:LayeredDrawableDescriptor.getMaskClipPath()}))
285        Text(`获取系统内置的裁剪路径参数:`)
286          .fontWeight(800)
287        Text(JSON.stringify(LayeredDrawableDescriptor.getMaskClipPath()))
288          .padding({ left: 20, right: 20 })
289      }.height('100%').justifyContent(FlexAlign.Center)
290    }.width('100%')
291  }
292}
293  ```
294
295## AnimationOptions<sup>12+</sup>
296
297PixelMap 数组通过Image组件显示时用来控制动画的播放。
298
299**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
300
301**系统能力:** SystemCapability.ArkUI.ArkUI.Full
302
303| 名称      | 类型    | 必填  | 说明                                    |
304| ---------- | ------ | -----| --------------------------------------- |
305| duration   | number | 否   | 设置图片数组播放总时间。默认每张图片1秒。      |
306| iterations | number | 否   | 设置图片数组播放次数。默认为1,为-1时无限播放。 |
307
308**示例:**
309
310```ts
311import { AnimationOptions } from '@kit.ArkUI'
312@Entry
313@Component
314struct Example {
315  options: AnimationOptions = { duration: 2000, iterations: 1 }
316  build() {
317  }
318}
319```
320
321## AnimatedDrawableDescriptor<sup>12+</sup>
322
323Image组件播放PixelMap数组时传入AnimatedDrawableDescriptor对象。继承自[DrawableDescriptor](#drawabledescriptor)。
324
325### constructor<sup>12+</sup>
326
327constructor(pixelMaps: Array\<image.PixelMap>, options?: AnimationOptions)
328
329AnimatedDrawableDescriptor的构造函数。
330
331**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
332
333**系统能力:** SystemCapability.ArkUI.ArkUI.Full
334
335**参数:**
336
337| 参数名     | 类型              | 必填  | 说明                                       |
338| --------- | ---------------- | ---- | ------------------------------------------ |
339| pixelMaps | Array\<[image.PixelMap](../apis-image-kit/js-apis-image.md#pixelmap7)>  | 是   | PixelMap 数组类型参数,存储 PixelMap 图片数据。 |
340| options   | [AnimationOptions](#animationoptions12) | 否   | 动画控制选项。                               |
341
342**示例:**
343
344```ts
345import { AnimationOptions, AnimatedDrawableDescriptor } from '@kit.ArkUI'
346import { image } from '@kit.ImageKit'
347
348@Entry
349@Component
350struct Example {
351  pixelmaps: Array<image.PixelMap>  = [];
352  options: AnimationOptions = {duration:1000, iterations:-1};
353  @State animated: AnimatedDrawableDescriptor  = new AnimatedDrawableDescriptor(this.pixelmaps, this.options);
354  async aboutToAppear() {
355    this.pixelmaps.push(await this.getPixmapFromMedia($r('app.media.icon')))
356    this.animated = new AnimatedDrawableDescriptor(this.pixelmaps, this.options);
357  }
358  build() {
359    Column() {
360      Row() {
361        Image(this.animated)
362      }
363    }
364  }
365  private async getPixmapFromMedia(resource: Resource) {
366    let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({
367      bundleName: resource.bundleName,
368      moduleName: resource.moduleName,
369      id: resource.id
370    })
371    let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength))
372    let createPixelMap: image.PixelMap = await imageSource.createPixelMap({
373      desiredPixelFormat: image.PixelMapFormat.RGBA_8888
374    })
375    await imageSource.release()
376    return createPixelMap
377  }
378}
379
380```