觸屏事件

2024-02-07 12:45 更新

觸屏事件指當手指/手寫筆在組件上按下、滑動、抬起時觸發(fā)的回調(diào)事件。包括點擊事件拖拽事件觸摸事件。

圖1 觸摸事件原理

點擊事件

點擊事件是指通過手指或手寫筆做出一次完整的按下和抬起動作。當發(fā)生點擊事件時,會觸發(fā)以下回調(diào)函數(shù):

  1. onClick(event: (event?: ClickEvent) => void)

event參數(shù)提供點擊事件相對于窗口或組件的坐標位置,以及發(fā)生點擊的事件源。

例如通過按鈕的點擊事件控制圖片的顯示和隱藏。
  1. @Entry
  2. @Component
  3. struct IfElseTransition {
  4. @State flag: boolean = true;
  5. @State btnMsg: string = 'show';
  6. build() {
  7. Column() {
  8. Button(this.btnMsg).width(80).height(30).margin(30)
  9. .onClick(() => {
  10. if (this.flag) {
  11. this.btnMsg = 'hide';
  12. } else {
  13. this.btnMsg = 'show';
  14. }
  15. // 點擊Button控制Image的顯示和消失
  16. this.flag = !this.flag;
  17. })
  18. if (this.flag) {
  19. Image($r('app.media.icon')).width(200).height(200)
  20. }
  21. }.height('100%').width('100%')
  22. }
  23. }

拖拽事件

拖拽事件指手指/手寫筆長按組件(>=500ms),并拖拽到接收區(qū)域釋放的事件。拖拽事件觸發(fā)流程:

拖拽事件的觸發(fā)通過長按、拖動平移判定,手指平移的距離達到5vp即可觸發(fā)拖拽事件。ArkUI支持應(yīng)用內(nèi)、跨應(yīng)用的拖拽事件。

拖拽事件提供以下接口

接口名稱

描述

onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilder | DragItemInfo)

拖拽啟動接口。當前僅支持自定義pixelmap和自定義組件。

onDragEnter(event: (event?: DragEvent, extraParams?: string) => void)

拖拽進入組件接口。DragEvent定義拖拽發(fā)生位置,extraParmas表示用戶自定義信息

onDragLeave(event: (event?: DragEvent, extraParams?: string) => void)

拖拽離開組件接口。DragEvent定義拖拽發(fā)生位置,extraParmas表示拖拽事件額外信息。

onDragMove(event: (event?: DragEvent, extraParams?: string) => void)

拖拽移動接口。DragEvent定義拖拽發(fā)生位置,extraParmas表示拖拽事件額外信息。

onDrop(event: (event?: DragEvent, extraParams?: string) => void)

拖拽釋放組件接口。DragEvent定義拖拽發(fā)生位置,extraParmas表示拖拽事件額外信息。

如下是跨窗口拖拽,拖出窗口示例:

  1. import image from '@ohos.multimedia.image';
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State visible: Visibility = Visibility.Visible
  6. private pixelMapReader = undefined
  7. aboutToAppear() {
  8. console.info('begin to create pixmap has info message: ')
  9. this.createPixelMap()
  10. }
  11. createPixelMap() {
  12. let color = new ArrayBuffer(4 * 96 * 96);
  13. var buffer = new Uint8Array(color);
  14. for (var i = 0; i < buffer.length; i++) {
  15. buffer[i] = (i + 1) % 255;
  16. }
  17. let opts = {
  18. alphaType: 0,
  19. editable: true,
  20. pixelFormat: 4,
  21. scaleMode: 1,
  22. size: { height: 96, width: 96 }
  23. }
  24. const promise = image.createPixelMap(color, opts);
  25. promise.then((data) => {
  26. console.info('create pixmap has info message: ' + JSON.stringify(data))
  27. this.pixelMapReader = data;
  28. })
  29. }
  30. @Builder pixelMapBuilder() {
  31. Text('drag item')
  32. .width('100%')
  33. .height(100)
  34. .fontSize(16)
  35. .textAlign(TextAlign.Center)
  36. .borderRadius(10)
  37. .backgroundColor(0xFFFFFF)
  38. }
  39. build() {
  40. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  41. Text('App1')
  42. .width('40%')
  43. .height(80)
  44. .fontSize(20)
  45. .margin(30)
  46. .textAlign(TextAlign.Center)
  47. .backgroundColor(Color.Pink)
  48. .visibility(Visibility.Visible)
  49. Text('Across Window Drag This')
  50. .width('80%')
  51. .height(80)
  52. .fontSize(16)
  53. .margin(30)
  54. .textAlign(TextAlign.Center)
  55. .backgroundColor(Color.Pink)
  56. .visibility(this.visible)
  57. .onDragStart(() => { //啟動跨窗口拖拽
  58. console.info('Text onDrag start')
  59. return { pixelMap: this.pixelMapReader, extraInfo: 'custom extra info.' }
  60. })
  61. .onDrop((event: DragEvent, extraParams: string) => {
  62. console.info('Text onDragDrop, ')
  63. this.visible = Visibility.None //拖動結(jié)束后,使源不可見
  64. })
  65. }
  66. .width('100%')
  67. .height('100%')
  68. }
  69. }

跨窗口拖拽,拖入示例:

  1. @Entry
  2. @Component
  3. struct Index {
  4. @State number: string[] = ['drag here']
  5. @State text: string = ''
  6. @State bool1: boolean = false
  7. @State bool2: boolean = false
  8. @State visible: Visibility = Visibility.Visible
  9. @State visible2: Visibility = Visibility.None
  10. scroller: Scroller = new Scroller()
  11. build() {
  12. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  13. Text('App2')
  14. .width('40%')
  15. .height(80)
  16. .fontSize(20)
  17. .margin(30)
  18. .textAlign(TextAlign.Center)
  19. .backgroundColor(Color.Pink)
  20. .visibility(Visibility.Visible)
  21. List({ space: 20, initialIndex: 0 }) {
  22. ForEach(this.number, (item) => {
  23. ListItem() {
  24. Text('' + item)
  25. .width('100%')
  26. .height(80)
  27. .fontSize(16)
  28. .borderRadius(10)
  29. .textAlign(TextAlign.Center)
  30. .backgroundColor(0xFFFFFF)
  31. }
  32. }, item => item)
  33. ListItem() {
  34. Text('Across Window Drag This')
  35. .width('80%')
  36. .height(80)
  37. .fontSize(16)
  38. .margin(30)
  39. .textAlign(TextAlign.Center)
  40. .backgroundColor(Color.Pink)
  41. .visibility(this.visible2)
  42. }
  43. }
  44. .height('50%')
  45. .width('90%')
  46. .border({ width: 1 })
  47. .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })
  48. .onDragEnter((event: DragEvent, extraParams: string) => { //拖拽進去組件
  49. console.info('List onDragEnter, ' + extraParams)
  50. })
  51. .onDragMove((event: DragEvent, extraParams: string) => { //拖拽時移動
  52. console.info('List onDragMove, ' + extraParams)
  53. })
  54. .onDragLeave((event: DragEvent, extraParams: string) => { //拖拽離開組件
  55. console.info('List onDragLeave, ' + extraParams)
  56. })
  57. .onDrop((event: DragEvent, extraParams: string) => { //釋放組件
  58. console.info('List onDragDrop, ' + extraParams)
  59. this.visible2 = Visibility.Visible //拖拽完成使拖入目標可見
  60. })
  61. }
  62. .width('100%')
  63. .height('100%')
  64. }
  65. }

觸摸事件

當手指或手寫筆在組件上觸碰時,會觸發(fā)不同動作所對應(yīng)的事件響應(yīng),包括按下(Down)、滑動(Move)、抬起(Up)事件:

  1. onTouch(event: (event?: TouchEvent) => void)
  • event.type為TouchType.Down:表示手指按下。
  • event.type為TouchType.Up:表示手指抬起。
  • event.type為TouchType.Move:表示手指按住移動。

觸摸事件可以同時多指觸發(fā),通過event參數(shù)可獲取觸發(fā)的手指位置、手指唯一標志、當前發(fā)生變化的手指和輸入的設(shè)備源等信息。

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TouchExample {
  5. @State text: string = '';
  6. @State eventType: string = '';
  7. build() {
  8. Column() {
  9. Button('Touch').height(40).width(100)
  10. .onTouch((event: TouchEvent) => {
  11. if (event.type === TouchType.Down) {
  12. this.eventType = 'Down';
  13. }
  14. if (event.type === TouchType.Up) {
  15. this.eventType = 'Up';
  16. }
  17. if (event.type === TouchType.Move) {
  18. this.eventType = 'Move';
  19. }
  20. this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
  21. + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
  22. + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
  23. + event.target.area.width + '\nheight:' + event.target.area.height
  24. })
  25. Button('Touch').height(50).width(200).margin(20)
  26. .onTouch((event: TouchEvent) => {
  27. if (event.type === TouchType.Down) {
  28. this.eventType = 'Down';
  29. }
  30. if (event.type === TouchType.Up) {
  31. this.eventType = 'Up';
  32. }
  33. if (event.type === TouchType.Move) {
  34. this.eventType = 'Move';
  35. }
  36. this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
  37. + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
  38. + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
  39. + event.target.area.width + '\nheight:' + event.target.area.height
  40. })
  41. Text(this.text)
  42. }.width('100%').padding(30)
  43. }
  44. }

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號