W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
拖拽事件指組件被長(zhǎng)按后拖拽時(shí)觸發(fā)的事件。
從API Version 8開(kāi)始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨(dú)標(biāo)記該內(nèi)容的起始版本。
名稱 | 支持冒泡 | 功能描述 |
---|---|---|
onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilder | DragItemInfo) | 否 | 第一次拖拽此事件綁定的組件時(shí),觸發(fā)回調(diào)。 - event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。 - extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。 返回值:當(dāng)前跟手效果所拖拽的對(duì)象,用于顯示拖拽時(shí)的提示組件。 長(zhǎng)按150ms可觸發(fā)拖拽事件。優(yōu)先級(jí):長(zhǎng)按手勢(shì)配置時(shí)間小于等于150ms時(shí),長(zhǎng)按手勢(shì)優(yōu)先觸發(fā),否則拖拽事件優(yōu)先觸發(fā)。 |
onDragEnter(event: (event?: DragEvent, extraParams?: string) => void) | 否 | 拖拽進(jìn)入組件范圍內(nèi)時(shí),觸發(fā)回調(diào)。 - event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。 - extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。 當(dāng)監(jiān)聽(tīng)了onDrop事件時(shí),此事件才有效。 |
onDragMove(event: (event?: DragEvent, extraParams?: string) => void) | 否 | 拖拽在組件范圍內(nèi)移動(dòng)時(shí),觸發(fā)回調(diào)。 - event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。 - extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。 當(dāng)監(jiān)聽(tīng)了onDrop事件時(shí),此事件才有效。 |
onDragLeave(event: (event?: DragEvent, extraParams?: string) => void) | 否 | 拖拽離開(kāi)組件范圍內(nèi)時(shí),觸發(fā)回調(diào)。 - event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。 - extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。 當(dāng)監(jiān)聽(tīng)了onDrop事件時(shí),此事件才有效。 |
onDrop(event: (event?: DragEvent, extraParams?: string) => void) | 否 | 綁定此事件的組件可作為拖拽釋放目標(biāo),當(dāng)在本組件范圍內(nèi)停止拖拽行為時(shí),觸發(fā)回調(diào)。 - event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。 - extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。 |
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
pixelMap | 否 | 設(shè)置拖拽過(guò)程中顯示的圖片。 | |
builder | 否 | 拖拽過(guò)程中顯示自定義組件,如果設(shè)置了pixelMap,則忽略此值。 | |
extraInfo | string | 否 | 拖拽項(xiàng)的描述。 |
用于返回組件在拖拽中需要用到的額外信息。
extraParams是Json對(duì)象轉(zhuǎn)換的string字符串,可以通過(guò)Json.parse轉(zhuǎn)換的Json對(duì)象獲取如下屬性。
名稱 | 類型 | 描述 |
---|---|---|
selectedIndex | number | 當(dāng)拖拽事件設(shè)在父容器的子元素時(shí),selectedIndex表示當(dāng)前被拖拽子元素是父容器第selectedIndex個(gè)子元素,selectedIndex從0開(kāi)始。 僅在ListItem組件的拖拽事件中生效。 |
insertIndex | number | 當(dāng)前拖拽元素在List組件中放下時(shí),insertIndex表示被拖拽元素插入該組件的第insertIndex個(gè)位置,insertIndex從0開(kāi)始。 僅在List組件的拖拽事件中生效。 |
名稱 | 類型 | 描述 |
---|---|---|
getX() | number | 當(dāng)前拖拽點(diǎn)相對(duì)于屏幕左上角的x軸坐標(biāo),單位為vp。 |
getY() | number | 當(dāng)前拖拽點(diǎn)相對(duì)于屏幕左上角的y軸坐標(biāo),單位為vp。 |
- @Observed
- class ClassA {
- public name: string
- public bol: boolean
- constructor(name: string, bol: boolean) {
- this.name = name
- this.bol = bol
- }
- }
- @Extend(Text) function textStyle() {
- .width('25%')
- .height(35)
- .fontSize(16)
- .textAlign(TextAlign.Center)
- .backgroundColor(0xAFEEEE)
- }
- @Entry
- @Component
- struct DragExample {
- @State arr: ClassA[] = [new ClassA('A', true), new ClassA('B', true), new ClassA('C', true)]
- @State dragIndex: number = 0
- changeIndex(index1: number, index2: number) { // 交換數(shù)組位置
- [this.arr[index1], this.arr[index2]] = [this.arr[index2], this.arr[index1]];
- }
- build() {
- Column() {
- Row({ space: 15 }) {
- List({ space: 20 }) {
- ForEach(this.arr, (item, index) => {
- ListItem() {
- Column() {
- Child({ a: this.arr[index] })
- }
- .onTouch((event: TouchEvent) => {
- if (event.type === TouchType.Down) {
- this.dragIndex = index // 獲取當(dāng)前拖拽子組件的索引
- console.info('onTouch' + this.dragIndex)
- }
- })
- }
- })
- }
- .listDirection(Axis.Horizontal)
- .onDrop((event: DragEvent, extraParams: string) => { // 綁定此事件的組件可作為拖拽釋放目標(biāo),當(dāng)在本組件范圍內(nèi)停止拖拽行為時(shí),觸發(fā)回調(diào)。
- let jsonString = JSON.parse(extraParams);
- this.changeIndex(this.dragIndex, jsonString.insertIndex)
- })
- }.padding({ top: 10, bottom: 10 }).margin(10)
- }.width('100%').height('100%').padding({ top: 20 }).margin({ top: 20 })
- }
- }
- @Component
- struct Child {
- @ObjectLink a: ClassA
- @Builder pixelMapBuilder() {
- Column() {
- Text(this.a.name)
- .width('50%')
- .height(60)
- .fontSize(16)
- .borderRadius(10)
- .textAlign(TextAlign.Center)
- .backgroundColor(Color.Yellow)
- }
- }
- build() {
- Column() {
- Text(this.a.name)
- .textStyle()
- .visibility(this.a.bol ? Visibility.Visible : Visibility.None)
- .onDragStart(() => { // 第一次拖拽此事件綁定的組件時(shí),觸發(fā)回調(diào)。
- this.a.bol = false // 控制顯隱
- return this.pixelMapBuilder() // 設(shè)置拖拽過(guò)程中顯示的圖片。
- })
- .onTouch((event: TouchEvent) => {
- if (event.type === TouchType.Up) {
- this.a.bol = true
- }
- })
- Text('')
- .width('25%')
- .height(35)
- .fontSize(16)
- .textAlign(TextAlign.Center)
- .border({ width: 5, color: 'red' })
- .visibility(!this.a.bol ? Visibility.Visible : Visibility.None)
- }
- }
- }
- // xxx.ets
- @Extend(Text) function textStyle () {
- .width('25%')
- .height(35)
- .fontSize(16)
- .textAlign(TextAlign.Center)
- .backgroundColor(0xAFEEEE)
- }
- @Entry
- @Component
- struct DragExample {
- @State numbers: string[] = ['one', 'two', 'three', 'four', 'five', 'six']
- @State text: string = ''
- @State bool: boolean = true
- @State eventType: string = ''
- @State appleVisible: Visibility = Visibility.Visible
- @State orangeVisible: Visibility = Visibility.Visible
- @State bananaVisible: Visibility = Visibility.Visible
- private dragList: string[] = ['apple', 'orange', 'banana']
- @State fruitVisible: Visibility[] = [Visibility.Visible, Visibility.Visible, Visibility.Visible]
- @State idx: number = 0
- // 自定義拖拽過(guò)程中顯示的內(nèi)容
- @Builder pixelMapBuilder() {
- Column() {
- Text(this.text)
- .width('50%')
- .height(60)
- .fontSize(16)
- .borderRadius(10)
- .textAlign(TextAlign.Center)
- .backgroundColor(Color.Yellow)
- }
- }
- build() {
- Column() {
- Text('There are three Text elements here')
- .fontSize(12)
- .fontColor(0xCCCCCC)
- .width('90%')
- .textAlign(TextAlign.Start)
- .margin(5)
- Row({ space: 15 }) {
- ForEach(this.dragList, (item, index) => {
- Text(item)
- .textStyle()
- .visibility(this.fruitVisible[index])
- .onDragStart(() => {
- this.bool = true
- this.text = item
- this.fruitVisible[index] = Visibility.None
- return this.pixelMapBuilder
- })
- .onTouch((event: TouchEvent) => {
- if (event.type === TouchType.Down) {
- this.eventType = 'Down'
- this.idx = index
- }
- if (event.type === TouchType.Up) {
- this.eventType = 'Up'
- if (this.bool) {
- this.fruitVisible[index] = Visibility.Visible
- }
- }
- })
- })
- }.padding({ top: 10, bottom: 10 }).margin(10)
- Text('This is a List element')
- .fontSize(12)
- .fontColor(0xCCCCCC)
- .width('90%')
- .textAlign(TextAlign.Start)
- .margin(15)
- List({ space: 20 }) {
- ForEach(this.numbers, (item) => {
- ListItem() {
- Text(item)
- .width('100%')
- .height(80)
- .fontSize(16)
- .borderRadius(10)
- .textAlign(TextAlign.Center)
- .backgroundColor(0xAFEEEE)
- }
- }, item => item)
- }
- .editMode(true)
- .height('50%')
- .width('90%')
- .border({ width: 1 })
- .padding(15)
- .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })
- .onDragEnter((event: DragEvent, extraParams: string) => {
- console.log('List onDragEnter, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
- })
- .onDragMove((event: DragEvent, extraParams: string) => {
- console.log('List onDragMove, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
- })
- .onDragLeave((event: DragEvent, extraParams: string) => {
- console.log('List onDragLeave, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
- })
- .onDrop((event: DragEvent, extraParams: string) => {
- let jsonString = JSON.parse(extraParams);
- if (this.bool) {
- // 通過(guò)splice方法插入元素
- this.numbers.splice(jsonString.insertIndex, 0, this.text)
- this.bool = false
- }
- this.fruitVisible[this.idx] = Visibility.None
- })
- }.width('100%').height('100%').padding({ top: 20 }).margin({ top: 20 })
- }
- }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: