🌟Harmony OS Next 手势操作大揭秘:让你的 App 动感十足!🌟
##Harmony OS Next ##Ark Ts ##教育
本文适用于教育科普行业进行学习,有错误之处请指出我会修改。
Hey 小伙伴们,搞开发时有没有被手势操作搞得头大?别慌!我这就带你全方位解读 HarmonyOS 的六大手势,从点击到旋转全打包成"口语说明书",还贴心地加了代码详解和避坑指南哦~💯
🖱️点击手势(TapGesture):点点点的小魔法
TapGesture(value?:{count?:number, fingers?:number})
—— 是不是看着头大?其实简单到爆炸!核心知识点来咯👇:
✨举个栗子:双击操作时设置count:2
,注意这俩规则:
// xxx.ets
@Entry
@Component
struct 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
@Component
struct 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
@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 + '\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)
}
}
复制代码
🔥重要说明:
✌️捏合手势(PinchGesture):放大镜搞起来
PinchGesture(value?:{fingers?:number, distance?:number})
—— 两指缩放超简单!
// 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 })
// 绑定缩放比例实现放大/缩小
.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
@Component
struct 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
@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)
// 绑定旋转角度
.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 太慢直接趴——调参时默念三遍:距离、速度、手指数量要到位!
评论