• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 拖拽事件
2
3ArkUI开发框架针对拖拽事件提供了[NODE_ON_PRE_DRAG](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype),[NODE_ON_DRAG_START](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype),[NODE_ON_DROP](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype),[NODE_ON_DRAG_ENTER](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype),[NODE_ON_DRAG_MOVE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype),[NODE_ON_DRAG_LEAVE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype),[NODE_ON_DRAG_END](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype)等组件事件,当拖拽在不同的阶段时会触发对应的组件事件,完成对应的数据处理操作,实现期望的拖拽交互能力。
4
5## 通用拖拽
6
7ArkUI提供了使用C和C++开发拖拽功能的能力,开发者可调用C API实现拖拽功能。以下以Image组件为例,详细介绍实现C API实现拖拽功能的基本步骤,以及在开发过程中需要注意的事项。
8
91. 组件拖拽设置。
10
11   获取[Node-API](../reference/apis-arkui/_ark_u_i___native_module.md#oh_arkui_getmoduleinterface),创建节点等操作均需通过Node-API完成。
12
13    ```cpp
14    ArkUI_NativeNodeAPI_1 *nodeAPI = nullptr;
15    OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI);
16    ```
17
18   创建Image节点,并设置draggable和其它相关属性。
19
20    ```cpp
21    auto image = nodeAPI->createNode(ARKUI_NODE_IMAGE);
22    ArkUI_NumberValue NODE_IMAGE_SRC_Item = {.string = "/pages/common/1111.png"};
23    ArkUI_NumberValue imageWidthValue[] = {100};
24    ArkUI_AttributeItem imageWidthItem = {imageWidthValue, 1};
25    ArkUI_NumberValue imageHeightValue[] = {100};
26    ArkUI_AttributeItem imageHeightItem = {imageHeightValue, 1};
27    ArkUI_NumberValue marginValue[] = {20};
28    ArkUI_AttributeItem marginItem = {marginValue, 1};
29    nodeAPI->setAttribute(image, NODE_WIDTH, &imageWidthItem);
30    nodeAPI->setAttribute(image, NODE_HEIGHT, &imageHeightItem);
31    nodeAPI->setAttribute(image, NODE_IMAGE_SRC, &NODE_IMAGE_SRC_Item);
32    nodeAPI->setAttribute(image, NODE_MARGIN, &marginItem);
33    nodeAPI->registerNodeEvent(image, NODE_ON_DRAG_START, 1, nullptr);
34    auto returnValue1 = OH_ArkUI_SetNodeDraggable(image, true);
35    ```
36
372. 自定义拖拽预览和背板图。
38
39   创建[pixelMap](../reference/apis-image-kit/_image___native_module.md#oh_pixelmapnative_createpixelmap),设置pixelMap的宽高等各项属性。设置Image节点的[dragPreviewOption](../reference/apis-arkui/drag__and__drop_8h.md#函数),可用于设置跟手图的圆角、角标等。
40
41    ```cpp
42      // 创建pixelMap
43      uint8_t data[960000];
44      size_t dataSize = 960000;
45      for (int i = 0; i < dataSize; i++) {
46        data[i] = i + 1;
47      }
48      // 创建参数结构体实例,并设置参数
49      OH_Pixelmap_InitializationOptions *createOpts;
50      OH_PixelmapInitializationOptions_Create(&createOpts);
51      OH_PixelmapInitializationOptions_SetWidth(createOpts, 400);
52      OH_PixelmapInitializationOptions_SetHeight(createOpts, 600);
53      OH_PixelmapInitializationOptions_SetPixelFormat(createOpts, PIXEL_FORMAT_BGRA_8888);
54      OH_PixelmapInitializationOptions_SetAlphaType(createOpts, PIXELMAP_ALPHA_TYPE_UNKNOWN);
55      // 创建Pixelmap实例
56      OH_PixelmapNative *pixelmap = nullptr;
57      OH_PixelmapNative_CreatePixelmap(data, dataSize, createOpts, &pixelmap);
58      OH_PixelmapNative_Rotate(pixelmap, 45);
59      OH_PixelmapNative_Opcity(pixelmap, 0.1);
60      OH_PixelmapNative_Scale(pixelmap, 0.5, 1.0);
61      OH_PixelmapNative_Translate(pixelmap, 50.0, 10.0);
62      OH_ArkUI_SetNodeDragPreview(image, pixelmap);
63      auto *previewOptions = OH_ArkUI_CreateDragPreviewOption();
64      auto returnValue2 = OH_ArkUI_DragPreviewOption_SetNumberBadgeEnabled(previewOptions, true);
65      auto returnValue3 = OH_ArkUI_DragPreviewOption_SetBadgeNumber(previewOptions, 10);
66      auto returnValue4 = OH_ArkUI_DragPreviewOption_SetDefaultRadiusEnabled(previewOptions, true);
67      OH_ArkUI_SetNodeDragPreviewOption(image, previewOptions);
68    ```
69
703. 设置相关事件。
71
72   C API的事件通过统一的回调来接收,当收到事件时通过[eventType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype)进行区分。
73
74    ```cpp
75    nodeAPI->registerNodeEventReceiver([](ArkUI_NodeEvent *event) {
76      auto eventType = OH_ArkUI_NodeEvent_GetEventType(event);
77      auto targetId = OH_ArkUI_NodeEvent_GetTargetId(event);
78      auto *dragEvent = OH_ArkUI_NodeEvent_GetDragEvent(event);
79      OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
80                    "targetId=%{public}d,eventType=%{public}d,", targetId,
81                    eventType);
82      switch (eventType) {
83        case NODE_ON_CLICK: {
84            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
85                          "ARKUI_NODE_BUTTON click! dragable");
86            break;
87        }
88        case NODE_ON_PRE_DRAG: {
89            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest", "NODE_ON_PRE_DRAG EventReceiver");
90            break;
91        }
92        case NODE_ON_DRAG_START: {
93            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
94                          "NODE_ON_DRAG_START EventReceiver");
95            break;
96        }
97        case NODE_ON_DROP: {
98            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest", "NODE_ON_DROP EventReceiver");
99            break;
100        }
101        case NODE_ON_DRAG_ENTER: {
102            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
103                          "NODE_ON_DRAG_ENTER EventReceiver");
104            break;
105        }
106        case NODE_ON_DRAG_MOVE: {
107            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
108                          "NODE_ON_DRAG_MOVE EventReceiver");
109            break;
110        }
111        case NODE_ON_DRAG_LEAVE: {
112            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
113                          "NODE_ON_DRAG_LEAVE EventReceiver");
114            break;
115        }
116        case NODE_ON_DRAG_END: {
117            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest", "NODE_ON_DRAG_END EventReceiver");
118            break;
119        }
120        }
121    });
122    ```
123
1244. 处理NODE_ON_DRAG_START事件。
125
126   在NODE_ON_DRAG_START事件中,应用可以执行起拖阶段所需的操作,通常涉及处理起拖过程的数据。例如,创建UdmfRecord,将用于拖拽图片所需的数据 imageUri以fileUri类型添加到[UdmfRecord](../reference/apis-arkdata/_u_d_m_f.md#oh_udmfrecord)中,接着将UdmfRecord设置到[udmfData](../reference/apis-arkdata/_u_d_m_f.md#oh_udmfdata)中,最后将UdmfData设置到[DragEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_dragevent)中。
127
128    ```cpp
129    case NODE_ON_DRAG_START: {
130      OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
131                    "NODE_ON_DRAG_START EventReceiver");
132      OH_UdmfRecord *record = OH_UdmfRecord_Create();
133      int returnValue;
134      OH_UdsFileUri *imageValue = OH_UdsFileUri_Create();
135      returnValue = OH_UdsFileUri_SetFileUri(imageValue, "/pages/common/1111.png");
136      returnValue = OH_UdmfRecord_AddFileUri(record, imageValue);
137      OH_UdmfData *data = OH_UdmfData_Create();
138      returnValue = OH_UdmfData_AddRecord(data, record);
139      returnValue = OH_ArkUI_DragEvent_SetData(dragEvent, data);
140      break;
141    }
142    ```
143
1445. 处理NODE_ON_DROP事件。
145
146   在NODE_ON_DROP事件中,应用可以执行与落入阶段相关的操作,通常需要获取拖拽过程中传递的数据。例如,获取[udmfData](../reference/apis-arkdata/_u_d_m_f.md#oh_udmfdata),判断是否存在所需的数据类型,从[UdmfRecord](../reference/apis-arkdata/_u_d_m_f.md#oh_udmfrecord)中提取相应的数据,最后销毁指针。
147
148    ```cpp
149    case NODE_ON_DROP: {
150        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
151                      "NODE_ON_DRAG_START EventReceiver");
152        // 获取UDMF data
153        int returnValue;
154        // 创建OH_UdmfData对象
155        OH_UdmfData *data = OH_UdmfData_Create();
156        returnValue = OH_ArkUI_DragEvent_GetUdmfData(dragEvent, data);
157        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
158                      "OH_ArkUI_DragEvent_GetUdmfData returnValue = %{public}d", returnValue);
159        // 判断OH_UdmfData是否有对应的类型
160        bool resultUdmf = OH_UdmfData_HasType(data, UDMF_META_GENERAL_FILE);
161        if (resultUdmf) {
162            // 获取OH_UdmfData的记录
163            unsigned int recordsCount = 0;
164            OH_UdmfRecord **records = OH_UdmfData_GetRecords(data, &recordsCount);
165            // 获取records中的元素
166            int returnStatus;
167            for (int i = 0; i < recordsCount; i++) {
168                // 从OH_UdmfRecord中获取文件类型数据
169                OH_UdsFileUri *imageValue = OH_UdsFileUri_Create();
170                returnStatus = OH_UdmfRecord_GetFileUri(records[i], imageValue);
171                const char* fileUri = OH_UdsFileUri_GetFileUri(imageValue);
172                OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
173                              "dragTest OH_UdmfRecord_GetPlainText "
174                              "returnStatus= %{public}d "
175                              "fileUri= %{public}s",
176                              returnStatus, fileUri);
177                // 使用结束后销毁指针
178                OH_UdsFileUri_Destroy(imageValue);
179            }
180        } else {
181            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
182                          "OH_UdmfData_HasType not contain UDMF_META_PLAIN_TEXT");
183        }
184        break;
185    }
186    ```
187
188## DragAction主动发起拖拽
189
190除了通用拖拽以外,ArkUI还提供了使用C API实现主动发起拖拽的能力。以下以文本拖拽为例,详细介绍实现C-API实现主动发起拖拽的基本步骤,以及在开发过程中需要注意的事项。
191
1921. 节点注册事件。
193
194   创建Button节点,设置按钮相关属性,同时需要注册[NODE_ON_TOUCH_INTERCEPT](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype)事件。
195
196    ```cpp
197    // buttonTouch作为targetId,用于区分不同target的事件。
198    enum {
199      buttonTouch
200    }
201
202    ArkUI_NativeNodeAPI_1 *nodeAPI = nullptr;
203    OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI);
204    auto button = nodeAPI->createNode(ARKUI_NODE_BUTTON);
205    ArkUI_AttributeItem NODE_Button_SRC_Item = {.string = "button"};
206    ArkUI_NumberValue buttonWidthValue[] = {200};
207    ArkUI_AttributeItem buttonWidthItem = {buttonWidthValue, 1};
208    ArkUI_NumberValue buttonHeightValue[] = {100};
209    ArkUI_AttributeItem buttonHeightItem = {buttonHeightValue, 1};
210    ArkUI_NumberValue marginValue[] = {20};
211    ArkUI_AttributeItem marginItem = {marginValue, 1};
212    nodeAPI->setAttribute(button, NODE_WIDTH, &buttonWidthItem);
213    nodeAPI->setAttribute(button, NODE_HEIGHT, &buttonHeightItem);
214    nodeAPI->setAttribute(button, NODE_MARGIN, &marginItem);
215    nodeAPI->setAttribute(button, NODE_BUTTON_LABEL, &NODE_Button_SRC_Item);
216    nodeAPI->registerNodeEvent(button, NODE_ON_TOUCH_INTERCEPT, buttonTouch, nullptr);
217    ```
2182. 接收NODE_ON_TOUCH_INTERCEPT事件。
219
220     DragAction主动发起拖拽需通过事件触发,在NODE_ON_TOUCH_INTERCEPT事件中执行发起拖拽所需的操作,通过[targetId](../reference/apis-arkui/_ark_u_i___native_module.md#oh_arkui_nodeevent_gettargetid)区分不同按钮触发的事件。
221
222      ```cpp
223      nodeAPI->registerNodeEventReceiver([](ArkUI_NodeEvent *event) {
224        auto eventType = OH_ArkUI_NodeEvent_GetEventType(event);
225        auto targetId = OH_ArkUI_NodeEvent_GetTargetId(event);
226        ArkUI_NodeHandle node = OH_ArkUI_NodeEvent_GetNodeHandle(event);
227        auto *dragEvent = OH_ArkUI_NodeEvent_GetDragEvent(event);
228        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
229                      "targetId=%{public}d,eventType=%{public}d,", targetId,
230                      eventType);
231        switch (eventType) {
232          case NODE_ON_TOUCH_INTERCEPT: {
233              OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
234                            "ARKUI_NODE_BUTTON touch intercept");
235              break;
236              switch (targetId) {
237                case buttonTouch: {
238                  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest", "dragTest button touch!");
239                }
240              }
241          }
242          case NODE_ON_DROP: {
243            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest", "NODE_ON_DROP EventReceiver");
244          }
245        }
246      });
247      ```
2483. 起拖阶段设置。
249
250     在NODE_ON_TOUCH_INTERCEPT事件中,需要对DragAction进行相关设置。为了主动发起拖拽,需要创建[pixelMap](../reference/apis-image-kit/_image___native_module.md#oh_pixelmapnative_createpixelmap),设置[dragPreviewOption](../reference/apis-arkui/drag__and__drop_8h.md#函数)和跟手点,并将拖拽过程中的文本数据设置到DragAction中。
251
252      ```cpp
253      case NODE_ON_TOUCH_INTERCEPT: {
254        // 设置pixelMap
255        uint8_t data[960000];
256        size_t dataSize = 960000;
257        for (int i = 0; i < dataSize; i++) {
258            data[i] = i + 1;
259        }
260        // 创建参数结构体实例,并设置参数
261        OH_Pixelmap_InitializationOptions *createOpts;
262        OH_PixelmapInitializationOptions_Create(&createOpts);
263        OH_PixelmapInitializationOptions_SetWidth(createOpts, 200);
264        OH_PixelmapInitializationOptions_SetHeight(createOpts, 300);
265        OH_PixelmapInitializationOptions_SetPixelFormat(createOpts, PIXEL_FORMAT_BGRA_8888);
266        OH_PixelmapInitializationOptions_SetAlphaType(createOpts, PIXELMAP_ALPHA_TYPE_UNKNOWN);
267        // 创建Pixelmap实例
268        OH_PixelmapNative *pixelmap = nullptr;
269        OH_PixelmapNative_CreatePixelmap(data, dataSize, createOpts, &pixelmap);
270        OH_PixelmapNative_Rotate(pixelmap, 90.0);
271        OH_PixelmapNative_Opacity(pixelmap, 0.2);
272        OH_PixelmapNative_Scale(pixelmap, 0.8, 1.0);
273        OH_PixelmapNative_Flip(pixelmap, true, true);
274        std::vector<OH_PixelmapNative *> pixelVector;
275        pixelVector.push_back(pixelmap);
276        int returnValue;
277        switch (targetId) {
278          case buttonTouch: {
279            // 创建DragAction
280            auto action1 = OH_ArkUI_CreateDragActionWithNode(node);
281            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
282                          "OH_ArkUI_CreateDragActionWithNode returnValue = %{public}p", action1);
283            returnValue =
284                OH_ArkUI_DragAction_SetPixelMaps(action1, pixelVector.data(), pixelVector.size());
285            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
286                          "OH_ArkUI_DragAction_SetPixelMaps returnValue = %{public}d", returnValue);
287            // 设置DragPreviewOption
288            auto *previewOptions1 = OH_ArkUI_CreateDragPreviewOption();
289            OH_ArkUI_DragPreviewOption_SetScaleMode(
290                previewOptions1, ArkUI_DragPreviewScaleMode::ARKUI_DRAG_PREVIEW_SCALE_DISABLED);
291            OH_ArkUI_DragPreviewOption_SetDefaultShadowEnabled(previewOptions1, true);
292            OH_ArkUI_DragPreviewOption_SetDefaultRadiusEnabled(previewOptions1, true);
293            returnValue = OH_ArkUI_DragAction_SetDragPreviewOption(action1, previewOptions1);
294            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
295                          "OH_ArkUI_DragAction_SetDragPreviewOption returnValue = %{public}d",
296                          returnValue);
297            // 设置pointerId
298            returnValue = OH_ArkUI_DragAction_SetPointerId(action1, 0); // -1 0 10
299            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
300                          "OH_ArkUI_DragAction_SetPointerId returnValue = %{public}d", returnValue);
301            // 设置touchPoint
302            returnValue = OH_ArkUI_DragAction_SetTouchPointX(action1, 200); // -1 0 200
303            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
304                          "OH_ArkUI_DragAction_SetTouchPointX returnValue = %{public}d", returnValue);
305            returnValue = OH_ArkUI_DragAction_SetTouchPointY(action1, 200); // -1 0 200
306            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
307                          "OH_ArkUI_DragAction_SetTouchPointY returnValue = %{public}d", returnValue);
308            // 设置unifiedData
309            // 创建OH_UdmfRecord对象
310            OH_UdmfRecord *record = OH_UdmfRecord_Create();
311            // 向OH_UdmfRecord中添加纯文本类型数据
312            OH_UdsPlainText *plainText = OH_UdsPlainText_Create();
313            int returnStatus;
314            OH_UdsPlainText_SetAbstract(plainText, "this is plainText Abstract example");
315            OH_UdsPlainText_SetContent(plainText, "this is plainText Content example");
316            returnStatus = OH_UdmfRecord_AddPlainText(record, plainText);
317            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
318                          "dragTest OH_UdmfRecord_AddPlainText returnStatus = %{public}d", returnStatus);
319            // 创建OH_UdmfData对象
320            OH_UdmfData *data = OH_UdmfData_Create();
321            // 向OH_UdmfData中添加OH_UdmfRecord
322            returnStatus = OH_UdmfData_AddRecord(data, record);
323            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
324                          "dragTest OH_UdmfData_AddRecord returnStatus = %{public}d", returnStatus);
325            returnValue = OH_ArkUI_DragAction_SetData(action1, data);
326            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
327                          "OH_ArkUI_DragAction_SetData returnValue = %{public}d", returnValue);
328            // startDrag
329            returnValue = OH_ArkUI_StartDrag(action1);
330            OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
331                          "OH_ArkUI_StartDrag returnValue = %{public}d", returnValue);
332            OH_ArkUI_DragAction_Dispose(action1);
333          }
334        }
335      }
336      ```
3374. 处理NODE_ON_DROP事件。
338
339   在NODE_ON_DROP事件中,应用可以执行与落入阶段相关的操作。通常情况下,需要从DragEvent中获取拖拽过程中传递的数据,DragAction中的拖拽数据也需要通过DragEvent获取。
340
341    ```cpp
342    case NODE_ON_DROP: {
343      OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest", "NODE_ON_DROP EventReceiver");
344      // 获取UDMF data
345      int returnValue;
346      // 创建OH_UdmfData对象
347      OH_UdmfData *data = OH_UdmfData_Create();
348      returnValue = OH_ArkUI_DragEvent_GetUdmfData(dragEvent, data);
349      OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
350                    "OH_ArkUI_DragEvent_GetUdmfData returnValue = %{public}d", returnValue);
351      // 判断OH_UdmfData是否有对应的类型
352      bool resultUdmf = OH_UdmfData_HasType(data, UDMF_META_PLAIN_TEXT);
353      if (resultUdmf) {
354          // 获取OH_UdmfData的记录
355          unsigned int recordsCount = 0;
356          OH_UdmfRecord **records = OH_UdmfData_GetRecords(data, &recordsCount);
357          // 获取records中的元素
358          int returnStatus;
359          for (int i = 0; i < recordsCount; i++) {
360              // 从OH_UdmfRecord中获取纯文本类型数据
361              OH_UdsPlainText *plainTextValue = OH_UdsPlainText_Create();
362              returnStatus = OH_UdmfRecord_GetPlainText(records[i], plainTextValue);
363              OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
364                            "dragTest OH_UdmfRecord_GetPlainText "
365                            "returnStatus= %{public}d",
366                            returnStatus);
367              auto getAbstract = OH_UdsPlainText_GetAbstract(plainTextValue);
368              auto getContent = OH_UdsPlainText_GetContent(plainTextValue);
369              OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
370                            "OH_UdsPlainText_GetAbstract = "
371                            "%{public}s, OH_UdsPlainText_GetContent = "
372                            "%{public}s",
373                            getAbstract, getContent);
374              // 使用结束后销毁指针
375              OH_UdsPlainText_Destroy(plainTextValue);
376          }
377      } else {
378          OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "dragTest",
379                        "OH_UdmfData_HasType not contain UDMF_META_PLAIN_TEXT");
380      }
381      break;
382    }
383    ```