W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
- TapGesture(value?:{count?:number; fingers?:number})
點擊手勢支持單次點擊和多次點擊,擁有兩個可選參數(shù):
- // xxx.ets
- @Entry
- @Component
- struct Index {
- @State value: string = "";
- build() {
- Column() {
- Text('Click twice').fontSize(28)
- .gesture(
- // 綁定count為2的TapGesture
- TapGesture({ count: 2 })
- .onAction((event: GestureEvent) => {
- this.value = JSON.stringify(event.fingerList[0]);
- }))
- Text(this.value)
- }
- .height(200)
- .width(250)
- .padding(20)
- .border({ width: 3 })
- .margin(30)
- }
- }
- LongPressGesture(value?:{fingers?:number; repeat?:boolean; duration?:number})
長按手勢用于觸發(fā)長按手勢事件,觸發(fā)長按手勢的最少手指數(shù)量為1,最短長按事件為500毫秒,擁有三個可選參數(shù):
以在Text組件上綁定可以重復(fù)觸發(fā)的長按手勢為例:
- // xxx.ets
- @Entry
- @Component
- struct Index {
- @State count: number = 0;
- build() {
- Column() {
- Text('LongPress OnAction:' + this.count).fontSize(28)
- .gesture(
- // 綁定可以重復(fù)觸發(fā)的LongPressGesture
- LongPressGesture({ repeat: true })
- .onAction((event: GestureEvent) => {
- if (event.repeat) {
- this.count++;
- }
- })
- .onActionEnd(() => {
- this.count = 0;
- })
- )
- }
- .height(200)
- .width(250)
- .padding(20)
- .border({ width: 3 })
- .margin(30)
- }
- }
- PanGesture(value?:{ fingers?:number; direction?:PanDirection; distance?:number})
拖動手勢用于觸發(fā)拖動手勢事件,滑動達到最小滑動距離(默認值為5vp)時拖動手勢識別成功,擁有三個可選參數(shù):
以在Text組件上綁定拖動手勢為例,可以通過在拖動手勢的回調(diào)函數(shù)中修改組件的布局位置信息來實現(xiàn)組件的拖動:
- // xxx.ets
- @Entry
- @Component
- struct Index {
- @State offsetX: number = 0;
- @State offsetY: number = 0;
- @State positionX: number = 0;
- @State positionY: number = 0;
- build() {
- Column() {
- Text('PanGesture Offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
- .fontSize(28)
- .height(200)
- .width(300)
- .padding(20)
- .border({ width: 3 })
- // 在組件上綁定布局位置信息
- .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
- .gesture(
- // 綁定拖動手勢
- PanGesture()
- .onActionStart((event: GestureEvent) => {
- console.info('Pan start');
- })
- // 當(dāng)觸發(fā)拖動手勢時,根據(jù)回調(diào)函數(shù)修改組件的布局位置信息
- .onActionUpdate((event: GestureEvent) => {
- this.offsetX = this.positionX + event.offsetX;
- this.offsetY = this.positionY + event.offsetY;
- })
- .onActionEnd(() => {
- this.positionX = this.offsetX;
- this.positionY = this.offsetY;
- })
- )
- }
- .height(200)
- .width(250)
- }
- }
大部分可滑動組件,如List、Grid、Scroll、Tab等組件是通過PanGesture實現(xiàn)滑動,在組件內(nèi)部的子組件綁定拖動手勢(PanGesture)或者滑動手勢(SwipeGesture)會導(dǎo)致手勢競爭。
當(dāng)在子組件綁定PanGesture時,在子組件區(qū)域進行滑動僅觸發(fā)子組件的PanGesture。如果需要父組件響應(yīng),需要通過修改手勢綁定方法或者子組件向父組件傳遞消息進行實現(xiàn),或者通過修改父子組件的PanGesture參數(shù)distance使得拖動更靈敏。當(dāng)子組件綁定SwipeGesture時,由于PanGesture和SwipeGesture觸發(fā)條件不同,需要修改PanGesture和SwipeGesture的參數(shù)以達到所需效果。
- PinchGesture(value?:{fingers?:number; distance?:number})
捏合手勢用于觸發(fā)捏合手勢事件,觸發(fā)捏合手勢的最少手指數(shù)量為2指,最大為5指,最小識別距離為5vp,擁有兩個可選參數(shù):
以在Column組件上綁定三指捏合手勢為例,可以通過在捏合手勢的函數(shù)回調(diào)中獲取縮放比例,實現(xiàn)對組件的縮小或放大:
- // xxx.ets
- @Entry
- @Component
- struct Index {
- @State scaleValue: number = 1;
- @State pinchValue: number = 1;
- @State pinchX: number = 0;
- @State pinchY: number = 0;
- build() {
- Column() {
- Column() {
- Text('PinchGesture scale:\n' + this.scaleValue)
- Text('PinchGesture center:\n(' + this.pinchX + ',' + this.pinchY + ')')
- }
- .height(200)
- .width(300)
- .border({ width: 3 })
- .margin({ top: 100 })
- // 在組件上綁定縮放比例,可以通過修改縮放比例來實現(xiàn)組件的縮小或者放大
- .scale({ x: this.scaleValue, y: this.scaleValue, z: 1 })
- .gesture(
- // 在組件上綁定三指觸發(fā)的捏合手勢
- PinchGesture({ fingers: 3 })
- .onActionStart((event: GestureEvent) => {
- console.info('Pinch start');
- })
- // 當(dāng)捏合手勢觸發(fā)時,可以通過回調(diào)函數(shù)獲取縮放比例,從而修改組件的縮放比例
- .onActionUpdate((event: GestureEvent) => {
- this.scaleValue = this.pinchValue * event.scale;
- this.pinchX = event.pinchCenterX;
- this.pinchY = event.pinchCenterY;
- })
- .onActionEnd(() => {
- this.pinchValue = this.scaleValue;
- console.info('Pinch end');
- })
- )
- }
- }
- }
- RotationGesture(value?:{fingers?:number; angle?:number})
旋轉(zhuǎn)手勢用于觸發(fā)旋轉(zhuǎn)手勢事件,觸發(fā)旋轉(zhuǎn)手勢的最少手指數(shù)量為2指,最大為5指,最小改變度數(shù)為1度,擁有兩個可選參數(shù):
以在Text組件上綁定旋轉(zhuǎn)手勢實現(xiàn)組件的旋轉(zhuǎn)為例,可以通過在旋轉(zhuǎn)手勢的回調(diào)函數(shù)中獲取旋轉(zhuǎn)角度,從而實現(xiàn)組件的旋轉(zhuǎn):
- // xxx.ets
- @Entry
- @Component
- struct Index {
- @State angle: number = 0;
- @State rotateValue: number = 0;
- build() {
- Column() {
- Text('RotationGesture angle:' + this.angle).fontSize(28)
- // 在組件上綁定旋轉(zhuǎn)布局,可以通過修改旋轉(zhuǎn)角度來實現(xiàn)組件的旋轉(zhuǎn)
- .rotate({ angle: this.angle })
- .gesture(
- RotationGesture()
- .onActionStart((event: GestureEvent) => {
- console.info('RotationGesture is onActionStart');
- })
- // 當(dāng)旋轉(zhuǎn)手勢生效時,通過旋轉(zhuǎn)手勢的回調(diào)函數(shù)獲取旋轉(zhuǎn)角度,從而修改組件的旋轉(zhuǎn)角度
- .onActionUpdate((event: GestureEvent) => {
- this.angle = this.rotateValue + event.angle;
- console.info('RotationGesture is onActionEnd');
- })
- // 當(dāng)旋轉(zhuǎn)結(jié)束抬手時,固定組件在旋轉(zhuǎn)結(jié)束時的角度
- .onActionEnd(() => {
- this.rotateValue = this.angle;
- console.info('RotationGesture is onActionEnd');
- })
- .onActionCancel(() => {
- console.info('RotationGesture is onActionCancel');
- })
- )
- }
- .height(200)
- .width(250)
- }
- }
- SwipeGesture(value?:{fingers?:number; direction?:SwipeDirection; speed?:number})
滑動手勢用于觸發(fā)滑動事件,當(dāng)滑動速度大于100vp/s時可以識別成功,擁有三個可選參數(shù):
以在Column組件上綁定滑動手勢實現(xiàn)組件的旋轉(zhuǎn)為例:
- // xxx.ets
- @Entry
- @Component
- struct Index {
- @State rotateAngle: number = 0;
- @State speed: number = 1;
- build() {
- Column() {
- Column() {
- Text("SwipeGesture speed\n" + this.speed)
- Text("SwipeGesture angle\n" + this.rotateAngle)
- }
- .border({ width: 3 })
- .width(300)
- .height(200)
- .margin(100)
- // 在Column組件上綁定旋轉(zhuǎn),通過滑動手勢的滑動速度和角度修改旋轉(zhuǎn)的角度
- .rotate({ angle: this.rotateAngle })
- .gesture(
- // 綁定滑動手勢且限制僅在豎直方向滑動時觸發(fā)
- SwipeGesture({ direction: SwipeDirection.Vertical })
- // 當(dāng)滑動手勢觸發(fā)時,獲取滑動的速度和角度,實現(xiàn)對組件的布局參數(shù)的修改
- .onAction((event: GestureEvent) => {
- this.speed = event.speed;
- this.rotateAngle = event.angle;
- })
- )
- }
- }
- }
當(dāng)SwipeGesture和PanGesture同時綁定時,若二者是以默認方式或者互斥方式進行綁定時,會發(fā)生競爭。SwipeGesture的觸發(fā)條件為滑動速度達到100vp/s,PanGesture的觸發(fā)條件為滑動距離達到5vp,先達到觸發(fā)條件的手勢觸發(fā)??梢酝ㄟ^修改SwipeGesture和PanGesture的參數(shù)以達到不同的效果。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: