写点什么

🌟Harmony OS Next 手势操作大揭秘:让你的 App 动感十足!🌟

作者:Turing_010
  • 2025-06-13
    广东
  • 本文字数:3214 字

    阅读完需:约 11 分钟

🌟Harmony OS Next手势操作大揭秘:让你的App动感十足!🌟

🌟Harmony OS Next 手势操作大揭秘:让你的 App 动感十足!🌟

##Harmony OS Next ##Ark Ts ##教育


本文适用于教育科普行业进行学习,有错误之处请指出我会修改。


Hey 小伙伴们,搞开发时有没有被手势操作搞得头大?别慌!我这就带你全方位解读 HarmonyOS 的六大手势,从点击到旋转全打包成"口语说明书",还贴心地加了代码详解和避坑指南哦~💯



🖱️点击手势(TapGesture):点点点的小魔法

TapGesture(value?:{count?:number, fingers?:number}) —— 是不是看着头大?其实简单到爆炸!​​核心知识点来咯👇:​



举个栗子:双击操作时设置count:2,注意这俩规则:


  • 两次点击间隔必须 <300ms(手指抬起的超时时间)

  • 多指操作时🖐️:如果第一指按下后 300ms 内没凑够人数,直接判定失败!


// xxx.ets@Entry@Componentstruct Index {  @State value: string = "";    build() {    Column() {      Text('Click twice').fontSize(28)        .gesture(          // 注意看这里:count设成2就是双击!          TapGesture({ count: 2 })            .onAction((event: GestureEvent|undefined) => {              if(event) {                // 获取第一根手指的位置信息                this.value = JSON.stringify(event.fingerList[0]);              }            })        )      Text(this.value)    }    .height(200).width(250).padding(20)    .border({ width: 3 }).margin(30)  }}
复制代码


📌划重点:别手贱设成count:0!系统会默默给你改成 1 哦~



⏳长按手势(LongPressGesture):按住别松手!

LongPressGesture(value?:{fingers?:number, repeat?:boolean, duration?:number}) —— 参数虽多,我分分钟讲明白!



🎯举个实用场景:做个计数器,长按时数字疯狂+1!


// xxx.ets@Entry@Componentstruct Index {  @State count: number = 0;
build() { Column() { Text('LongPress OnAction:' + this.count).fontSize(28) .gesture( // repeat=true是关键!松开才归零 LongPressGesture({ repeat: true }) .onAction((event: GestureEvent|undefined) => { if(event?.repeat) this.count++; // 持续+1 }) .onActionEnd(() => { this.count = 0; }) // 松手清零 ) } .height(200).width(250).padding(20) .border({ width: 3 }).margin(30) }}
复制代码


⚠️避坑指南duration别设太小!用户按快了根本不触发🤦‍♂️



↔️拖动手势(PanGesture):推箱子既视感

PanGesture(value?:{ fingers?:number, direction?:PanDirection, distance?:number}) —— 实现组件随手指移动!



// xxx.ets@Entry@Componentstruct 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 + '\nY: ' + this.offsetY) .fontSize(28).height(200).width(300).padding(20).border({ width: 3 }) // 关键在这行!绑定位置实现拖动 .translate({ x: this.offsetX, y: this.offsetY, z: 0 }) .gesture( PanGesture() .onActionUpdate((event: GestureEvent|undefined) => { if(event) { // 实时更新坐标 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 等滑动组件自带 PanGesture,子组件绑定会冲突

  • 解决方案→修改父/子组件的distance参数让父级更灵敏,或者用事件传递协调



✌️捏合手势(PinchGesture):放大镜搞起来

PinchGesture(value?:{fingers?:number, distance?:number}) —— 两指缩放超简单!



// xxx.ets@Entry@Componentstruct 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 }) // 绑定缩放比例实现放大/缩小 .scale({ x: this.scaleValue, y: this.scaleValue, z: 1 }) .gesture( // 三指触发!fingers:3 PinchGesture({ fingers: 3 }) .onActionUpdate((event: GestureEvent|undefined) => { if(event) { this.scaleValue = this.pinchValue * event.scale; // 计算新比例 this.pinchX = event.pinchCenterX; // 获取中心点X this.pinchY = event.pinchCenterY; // 获取中心点Y } }) ) } }}
复制代码


💡性能 TIP:频繁缩放时,把计算逻辑放onActionUpdate里避免卡顿!



🔄旋转手势(RotationGesture):转盘小游戏神器

RotationGesture(value?:{fingers?:number, angle?:number}) —— 手指一扭组件就转!



// xxx.ets@Entry@Componentstruct Index {  @State angle: number = 0;  @State rotateValue: number = 0;
build() { Column() { Text('RotationGesture angle:' + this.angle).fontSize(28) // 绑定旋转角度 .rotate({ angle: this.angle }) .gesture( RotationGesture() .onActionUpdate((event: GestureEvent|undefined) => { if(event) { this.angle = this.rotateValue + event.angle; // 累加旋转值 } }) .onActionEnd(() => { this.rotateValue = this.angle; // 松手时固定角度 }) ) .height(200).width(300).padding(20) .border({ width: 3 }).margin(100) } }}
复制代码


🚨注意:别忘onActionEnd保存角度!不然一松手就回弹啦~



💨滑动手势(SwipeGesture):刷微博就靠它

SwipeGesture(value?:{fingers?:number, direction?:SwipeDirection, speed?:number}) —— 滑动速度决定成败!



// xxx.ets@Entry@Componentstruct 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) // 绑定旋转角度 .rotate({ angle: this.rotateAngle }) .gesture( // 限制垂直方向触发 SwipeGesture({ direction: SwipeDirection.Vertical }) .onAction((event: GestureEvent|undefined) => { if(event) { this.speed = event.speed; // 获取滑动速度 this.rotateAngle = event.angle; // 获取旋转角度 } }) ) } }}
复制代码



🧠终极总结表:手势参数一网打尽


🎯一句话牢记


手势玩得 6,参数别搞错!👏Pan 遇到 List 会打架,Swipe 太慢直接趴——调参时默念三遍:距离、速度、手指数量要到位!

用户头像

Turing_010

关注

还未添加个人签名 2025-05-22 加入

还未添加个人简介

评论

发布
暂无评论
🌟Harmony OS Next手势操作大揭秘:让你的App动感十足!🌟_Turing_010_InfoQ写作社区