1# 事件独占控制
2
3设置组件是否独占事件,事件范围包括组件自带的事件和开发者自定义的点击、触摸、手势事件。<br />
4在一个窗口内,设置了独占控制的组件上的事件如果首先响应,则本次交互只允许此组件上设置的事件响应,窗口内其他组件上的事件不会响应。
5
6>  **说明:**
7>
8>  从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
9
10## monopolizeEvents
11
12monopolizeEvents(monopolize: boolean)
13
14设置组件是否独占事件。
15
16**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
17
18**系统能力:** SystemCapability.ArkUI.ArkUI.Full
19
20**参数:**
21
22
23| 参数名   | 类型 | 必填 | 说明                  |
24| ----------- | -------- | ------------------------ | ------------------------ |
25| monopolize | boolean  | 是 | 设置组件是否独占事件。<br />默认值:false <br />**说明:**<br />1、如果第一根手指触发了组件事件独占,在抬起前又按下了一根手指,则第二根手指的交互继续处于组件独占状态,依次类推。<br />2、如果开发者通过[parallelGesture](ts-gesture-settings.md)绑定了与子组件同时触发的手势,如[PanGesture](ts-basic-gestures-pangesture.md),子组件设置了独占控制且首个响应事件,则父组件的手势不会响应。|
26
27## 示例
28
29该示例通过配置monopolizeEvents实现组件是否独占事件。
30
31```ts
32// xxx.ets
33@Entry
34@Component
35struct Index {
36  @State message: string = 'set monopolizeEvents false'
37  @State messageOut: string = ' '
38  @State messageInner: string = ' '
39  @State monopolize: boolean = false
40
41  build() {
42    Column() {
43      Text(this.message)
44        .fontSize(22)
45        .margin(10)
46      Text(this.messageOut)
47        .fontSize(22)
48        .margin(10)
49      Text(this.messageInner)
50        .fontSize(22)
51        .margin(10)
52      Button('clean')
53        .fontSize(22)
54        .margin(10)
55        // 通过button的点击事件来切换内层column的独占控制属性
56        .onClick(()=>{
57          this.messageOut = " "
58          this.messageInner = " "
59        })
60      Button('change monopolizeEvents')
61        .fontSize(22)
62        .margin(10)
63        // 通过button的点击事件来切换内层column的独占控制属性
64        .onClick(()=>{
65          this.monopolize = !this.monopolize
66          if (!this.monopolize) {
67            this.message = "set monopolizeEvents false"
68          } else {
69            this.message = "set monopolizeEvents true"
70          }
71        })
72      Column() {
73        Column(){}
74        // this.monopolize是true时,点击内层column只会触发自身的触摸事件,不会触发外层column的触摸事件
75        // this.monopolize是false时,点击内层column会同时触发自身的触摸事件和外层column的触摸事件
76        .monopolizeEvents(this.monopolize)
77        .width('100%')
78        .height('40%')
79        .backgroundColor(Color.Blue)
80        // 内层column绑定触摸事件
81        .onTouch((event:TouchEvent)=>{
82          if (event.type == TouchType.Down) {
83            console.log("inner column touch down")
84            this.messageInner = "inner column touch down"
85          }
86        })
87      }
88      .backgroundColor(Color.Gray)
89      .height('100%')
90      .width('100%')
91      // 外层column绑定触摸事件
92      .onTouch((event)=>{
93        if (event.type == TouchType.Down) {
94          console.log("outside column touch down")
95          this.messageOut = "inner column touch down"
96        }
97      })
98    }
99    .height('100%')
100  }
101}
102```
103![obscured](figures/monopolize-events.gif)