当前位置:   article > 正文

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:拖拽控制)_openharmony array

openharmony array

设置组件是否可以响应拖拽事件。

说明:

从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

ArkUI框架对以下组件实现了默认的拖拽能力,支持对数据的拖出或拖入响应,开发者只需要将这些组件的draggable属性设置为true,即可使用默认拖拽能力。

  • 默认支持拖出能力的组件(可从组件上拖出数据):Search、TextInput、TextArea、RichEditor、Text、Image、FormComponent、Hyperlink

  • 默认支持拖入能力的组件(目标组件可响应拖入数据):Search、TextInput、TextArea、Video

开发者也可以通过实现通用拖拽事件来自定义拖拽响应。

其他组件需要开发者将draggable属性设置为true,并在onDragStart等接口中实现数据传输相关内容,才能正确处理拖拽。

allowDrop

allowDrop(value: Array<UniformDataType>)

设置该组件上允许落入的数据类型。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名类型必填说明
valueArray<UniformDataType>设置该组件上允许落入的数据类型。
默认值:空

draggable

draggable(value: boolean)

设置该组件是否允许进行拖拽。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名类型必填说明
valueboolean设置该组件是否允许进行拖拽。
默认值:false

dragPreview11+

dragPreview(value: CustomBuilder | DragItemInfo)

设置组件拖拽过程中的预览图。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名类型必填说明
valueCustomBuilder | DragItemInfo设置组件拖拽过程中的预览图,仅在onDragStart拖拽方式中有效。
当组件支持拖拽并同时设置bindContextMenu的预览图时,则长按浮起的预览图以bindContextMenu设置的预览图为准。开发者在onDragStart中返回的背板图优先级低于dragPreview设置的预览图,当设置了dragPreview预览图时,拖拽过程中的背板图使用dragPreview预览图。由于CustomBuilder需要离线渲染之后才能使用,因此存在一定的性能开销和时延,推荐优先使用 DragItemInfo中的PixelMap方式。
默认值:空

dragPreviewOptions11+

dragPreviewOptions(value: DragPreviewOptions)

设置拖拽过程中背板图处理模式。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名类型必填说明
valueDragPreviewOptions11+设置拖拽过程中背板图处理模式。
默认值:DragPreviewMode.AUTO

DragPreviewOptions11+

名称类型必填描述
modeDragPreviewMode表示拖拽过程中背板图处理模式。
默认值:DragPreviewMode.AUTO

DragPreviewMode11+枚举说明

名称枚举值描述
AUTO0系统根据拖拽场景自动改变跟手点位置,根据规则自动对拖拽背板图进行缩放变换等。
DISABLE_SCALE1禁用系统对拖拽背板图的缩放行为。

示例

示例1

allowDrop与draggable属性用法示例

  1. // xxx.ets
  2. import UDC from '@ohos.data.unifiedDataChannel';
  3. import UTD from '@ohos.data.uniformTypeDescriptor';
  4. @Entry
  5. @Component
  6. struct ImageExample {
  7. @State uri: string = ""
  8. @State AblockArr: string[] = []
  9. @State BblockArr: string[] = []
  10. @State AVisible: Visibility = Visibility.Visible
  11. @State dragSuccess :Boolean = false
  12. build() {
  13. Column() {
  14. Text('Image拖拽')
  15. .fontSize('30dp')
  16. Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceAround }) {
  17. Image($r('app.media.icon'))
  18. .width(100)
  19. .height(100)
  20. .border({ width: 1 })
  21. .visibility(this.AVisible)
  22. .draggable(true)
  23. .onDragEnd((event: DragEvent) => {
  24. let ret = event.getResult();
  25. if(ret == 0) {
  26. console.log("enter ret == 0")
  27. this.AVisible = Visibility.Hidden;
  28. } else {
  29. console.log("enter ret != 0")
  30. this.AVisible = Visibility.Visible;
  31. }
  32. })
  33. }
  34. .margin({ bottom: 20 })
  35. Row() {
  36. Column(){
  37. Text('不允许释放区域(显示不允许角标但可以释放)')
  38. .fontSize('15dp')
  39. .height('10%')
  40. List(){
  41. ForEach(this.AblockArr, (item:string, index) => {
  42. ListItem() {
  43. Image(item)
  44. .width(100)
  45. .height(100)
  46. .border({width: 1})
  47. }
  48. .margin({ left: 30 , top : 30})
  49. }, (item:string) => item)
  50. }
  51. .height('90%')
  52. .width('100%')
  53. .allowDrop([UTD.UniformDataType.TEXT])
  54. .onDrop((event?: DragEvent, extraParams?: string) => {
  55. this.uri = JSON.parse(extraParams as string).extraInfo;
  56. this.AblockArr.splice(JSON.parse(extraParams as string).insertIndex, 0, this.uri);
  57. console.log("ondrop not udmf data");
  58. })
  59. .border({width: 1})
  60. }
  61. .height("50%")
  62. .width("45%")
  63. .border({ width: 1 })
  64. .margin({ left: 12 })
  65. Column(){
  66. Text('可释放区域')
  67. .fontSize('15dp')
  68. .height('10%')
  69. List(){
  70. ForEach(this.BblockArr, (item:string, index) => {
  71. ListItem() {
  72. Image(item)
  73. .width(100)
  74. .height(100)
  75. .border({width: 1})
  76. }
  77. .margin({ left: 30 , top : 30})
  78. }, (item:string) => item)
  79. }
  80. .border({width: 1})
  81. .height('90%')
  82. .width('100%')
  83. .allowDrop([UTD.UniformDataType.IMAGE])
  84. .onDrop((event?: DragEvent, extraParams?: string) => {
  85. console.log("enter onDrop")
  86. let dragData:UnifiedData = (event as DragEvent).getData() as UnifiedData;
  87. if(dragData != undefined) {
  88. let arr:Array<UDC.UnifiedRecord> = dragData.getRecords();
  89. if(arr.length > 0) {
  90. let image = arr[0] as UDC.Image;
  91. this.uri = image.imageUri;
  92. this.BblockArr.splice(JSON.parse(extraParams as string).insertIndex, 0, this.uri);
  93. } else {
  94. console.log(`dragData arr is null`)
  95. }
  96. } else {
  97. console.log(`dragData is undefined`)
  98. }
  99. console.log("ondrop udmf data");
  100. this.dragSuccess = true
  101. })
  102. }
  103. .height("50%")
  104. .width("45%")
  105. .border({ width: 1 })
  106. .margin({ left: 12 })
  107. }
  108. }.width('100%')
  109. }
  110. }

dragImage.gif

示例2

dragPreview属性用法示例

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct DragPreviewDemo{
  5. @Builder dragPreviewBuilder() {
  6. Column() {
  7. Text("dragPreview")
  8. .width(150)
  9. .height(50)
  10. .fontSize(20)
  11. .borderRadius(10)
  12. .textAlign(TextAlign.Center)
  13. .fontColor(Color.Black)
  14. .backgroundColor(Color.Pink)
  15. }
  16. }
  17. @Builder MenuBuilder() {
  18. Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
  19. Text("menu item 1")
  20. .fontSize(15)
  21. .width(100)
  22. .height(40)
  23. .textAlign(TextAlign.Center)
  24. .fontColor(Color.Black)
  25. .backgroundColor(Color.Pink)
  26. Divider()
  27. .height(5)
  28. Text("menu item 2")
  29. .fontSize(15)
  30. .width(100)
  31. .height(40)
  32. .textAlign(TextAlign.Center)
  33. .fontColor(Color.Black)
  34. .backgroundColor(Color.Pink)
  35. }
  36. .width(100)
  37. }
  38. build() {
  39. Row() {
  40. Column() {
  41. Image('/resource/image.jpeg')
  42. .width("30%")
  43. .draggable(true)
  44. .bindContextMenu(this.MenuBuilder, ResponseType.LongPress)
  45. .onDragStart(() => {
  46. console.log("Image onDragStart")
  47. })
  48. .dragPreview(this.dragPreviewBuilder)
  49. }
  50. .width("100%")
  51. }
  52. .height("100%")
  53. }
  54. }

dragPreview.gif

示例3

dragPreviewOptions属性用法示例

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct dragPreviewOptionsDemo{
  5. build() {
  6. Row() {
  7. Column() {
  8. Image('/resource/image.jpeg')
  9. .margin({ top: 10 })
  10. .width("100%")
  11. .draggable(true)
  12. .dragPreviewOptions({ mode: DragPreviewMode.AUTO })
  13. }
  14. .width("100%")
  15. .height("100%")
  16. }
  17. }
  18. }

dragPreviewOptions.gif

最后,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(Harmony NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(Harmony NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

 获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(Harmony NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/337587
推荐阅读
相关标签
  

闽ICP备14008679号