豪五行属什么| 1998年属什么生肖| 对牛弹琴告诉我们什么道理| 酚氨咖敏片的别名叫什么| 肠道为什么会长息肉| 四个月念什么字| 酒花浸膏是什么| 头发五行属什么| 佳木斯二院全名叫什么| 硅橡胶是什么材料| 苏州有什么特产可以带回家| 吸气是什么意思| 结婚纪念日送什么礼物| 生殖器疱疹是什么原因引起的| 有因必有果什么意思| 梦见铲雪预示着什么| 看乳腺挂什么科| 什么属相不能摆放大象| pdn是什么意思| 心窝窝疼是什么原因| 三什么一什么| egfr医学上是什么意思| 什么枝条| ck属于什么档次的品牌| 心脏疼挂什么科| a216是什么材质| 烟草是什么植物| 大圆脸适合什么发型| 小孩尿酸高是什么原因| 不孕不育查什么项目| 脉跳的快是什么原因| 毛囊炎用什么药膏最好| 5月10日是什么星座| 孩子a型血父母什么血型| 嗜的意思是什么| 发改委主任什么级别| 甲基是什么| 头皮特别痒是什么原因| 哈哈是什么意思| 玄是什么颜色| 作恶多端是什么意思| 六尘不染的生肖是什么| 什么牛不吃草| 手脚发麻是什么原因引起的| 舅舅的孙子叫我什么| 工夫是什么意思| 明年属什么生肖| 蓝牙耳机什么样的好| gc是什么| 练深蹲有什么好处| 55岁属什么生肖| 早上4点是什么时辰| 王的五行属性是什么| 西元前是什么意思| 中国梦是什么意思| 笔试是什么意思| 不孕吐的人说明什么| 齐耳短发适合什么脸型| 酌情是什么意思| 最近有什么病毒| 全麻手术后为什么不能睡觉| 端午节都吃什么菜好| 东南西北五行属什么| 呼吸性碱中毒吃什么药| 白内障有什么症状| 明知故犯的故是什么意思| 26岁属什么| 火字旁的字有什么| 花漾是什么意思| 脑血管堵塞会有什么后果| 46是什么意思| 梦见小狗是什么意思| browser什么意思| 宫代表什么生肖| 炖鸡肉放什么调料| 失恋是什么意思| 麦冬长什么样| 肉毒为什么怕热敷| 孕妇感冒可以吃什么感冒药| 7月一日是什么节| 以什么乱什么| 交感神经型颈椎病吃什么药| 蚂蚁上树是什么菜| 口腔发粘是什么原因| ri是什么意思| 太容易出汗是什么原因| 坤字五行属什么| 男性尿道出血什么原因| 拉谷谷女装什么档次的| 乙肝会有什么表现症状| 意味深长的意思是什么| 术前八项检查是什么| 貌不惊人是什么意思| 补血最快的方法是什么| 吃什么能消除囊肿| 疱疹性咽峡炎是什么引起的| 六月八号是什么星座| 眼睛一直跳是什么原因| 宝宝拉肚子吃什么药| top1是什么意思| 82属什么生肖| 福寿螺为什么不能吃| 秦时明月什么时候更新| 什么叫抗体阳性| 严重失眠吃什么药管用| 什么叫基因检测| 38岁属什么生肖| 石灰的主要成分是什么| 空腹是什么意思| 老觉得饿是什么原因| 乌鸡炖什么好吃| 减肥吃什么主食比较好| 505是什么意思| 怀孕肚子胀是什么原因| 升白针是什么药| 老是想睡觉是什么原因| 喝什么茶叶减肥效果最好| 飞机加什么油| 遗传物质的载体是什么| 三十六计第一计是什么| 脂蛋白高是什么原因| 晰字五行属什么| 鱼上浮的原因是什么| 程字五行属什么| 柚子是什么季节的水果| 老年人嘴唇发紫是什么原因| 什么是心律失常| andy是什么意思| 腰花是什么部位| 不丹为什么不跟中国建交| 怀孕初期需要补充什么营养| 重建是什么意思| 晚上睡觉脚抽筋是什么原因| 夜间睡觉出汗是什么原因| 记性不好吃什么药| 例假颜色发黑是什么原因| mmhg是什么意思| 嬉皮士是什么意思| 算理是什么意思| 驻颜是什么意思| 顶天立地是什么意思| 手指头抽筋是什么原因| 妯娌什么意思| 尿酸高肌酐高是什么原因呢| 上火喝什么茶| 心率低是什么原因| 低钠有什么症状和危害| 维生素k2是什么| 自私自利是什么意思| 坐月子不能吃什么| 血竭是什么东西| 男生为什么要割包皮| 什么样的柳树| 色拉油是什么| 脾虚吃什么中成药| 生的反义词是什么| 浅表性胃炎伴糜烂吃什么药效果好| 喉咙有异物感看什么科| 耄耋什么意思| 梦见好多蛇是什么意思| 牙疼吃什么菜降火最快| 五脏主什么| gg是什么牌子| 省长什么级别| 心率慢吃什么药| 维生素b6主治什么病| 年柱金舆是什么意思| hazzys是什么牌子| 6s管理内容是什么| 过江龙是什么意思| 智五行属性是什么| 嗓子疼什么原因| 男人右眼皮跳是什么预兆| 玉溪烟属于什么档次| 下午5点半是什么时辰| 迪根是什么药| 芊芊是什么意思| 梦见丢了一只鞋是什么意思| 什么是农历| 剖腹产后能吃什么水果| 学信网上的报告编号是什么| 椎间盘膨出是什么意思| ost是什么| 咖啡配什么好喝| 什么是沙眼| 框框是什么意思| 眼屎多吃什么药效果好| 咳出痰带血是什么原因| 吃冰糖有什么好处和坏处| pr过高是什么意思| 李白是什么星座| 母仪天下是什么意思| 性激素六项检查是什么| 为什么会得近视眼| 乙肝三抗体阳性是什么意思| crew是什么意思| 什么颜色加什么颜色等于白色| 淋巴结清扫是什么意思| 根是什么| 为什么刚吃完饭不能洗澡| 合成立方氧化锆是什么| 七月二十五是什么星座| 计划生育是什么意思| 什么叫自慰| 阴囊潮湿是什么原因造成的| 6月28什么星座| 肝血管瘤有什么症状表现| 美国白宫是干什么的| 为什么会得卵巢癌| 什么是冷暴力| 血糖30多有什么危险| 右侧卵巢囊性回声什么意思| 肚子有虫吃什么药| 扁的桃子叫什么名字| 梅毒吃什么药| 地藏王菩萨为什么不能拜| 阳气不足是什么意思| 待寝什么意思| 甲减饮食需要注意什么| 感冒吃什么药好| 尿频尿急用什么药| 猫咪飞机耳是什么意思| 退而求其次什么意思| 闺房之乐是什么意思| 什么是垃圾食品| 医保统筹是什么意思| 拿什么证明分居两年| 大洋马是什么意思| 治骨质疏松打什么针| 吃什么东西补肾| 吐黄水是什么原因| 什么原因导致有幽门杆菌| 沉香茶属于什么茶| 95棉5氨纶是什么面料| 肾结石要忌口什么东西| 断桥铝是什么意思| 腋下淋巴结肿大挂什么科| 逆熵是什么意思| 腰上长痘痘是什么原因| 三五成群是什么意思| 为什么同房后会出血| 脚痒用什么药膏最有效| 细菌性肠炎吃什么药| 去医院看嘴唇挂什么科| 什么叫红颜知己| 安眠药有什么副作用| 双肾结晶什么意思| 双子座是什么性格| 袋鼠喜欢吃什么食物| 12月21日是什么星座| 念珠菌用什么药最好| 急性支气管炎吃什么药| 金牛座和什么星座最不配| 二尖瓣反流吃什么药| 世界杯什么时候开始| 冲猴煞北是什么意思| 韩语阿西吧是什么意思| 粉色史迪仔叫什么| 无人区是什么意思| 营养包是什么| 耳朵里面痒是什么原因| 外贸是什么| 明天是什么节气| 为什么医院不用咳特灵| 百度

蔡英文出行 台中警局派“认人小组”死盯抗议人士

百度 与工业负荷每天早上八九点工厂开工的这一升、半夜停工这一降对电网构成的冲击相比,“地球一小时”带来电网负荷的影响非常有限,加之电网具备一定的调节能力,“地球一小时”的影响基本可以忽略不计。

业务开发中,我们常需要监听节点 touch 事件,处理拖拽、缩放相关逻辑。由于 Skyline 采用双线程架构,在进行这样的交互动画时,会具有较大的异步延迟,这点可以参考 wxs 响应事件

Skylinewxs 代码运行在 JS 线程,而事件产生在 UI 线程,因此 wxs 动画 性能有所降低,为了提升小程序交互体验的效果,我们内置了一批手势组件,使用手势组件的优势包括

  1. 免去开发者监听 touch 事件,自行计算手势逻辑的复杂步骤
  2. 手势组件直接在 UI 线程响应,避免了传递到 JS 线程带来的延迟

# 效果展示

下图演示了使用手势、协商手势实现的拖动小球,半屏弹窗手势拖动关闭,分段半屏等效果。点击查看更多 Skyline 示例

扫码小程序示例,分别体验 基础手势协商手势 新特性

# 手势组件

组件名称 触发时机
<tap-gesture-handler> 点击时触发
<double-tap-gesture-handler> 双击时触发
<scale-gesture-handler> 多指缩放时触发
<force-press-gesture-handler> iPhone 设备重按时触发
<pan-gesture-handler> 拖动(横向/纵向)时触发
<vertical-drag-gesture-handler> 纵向滑动时触发
<horizontal-drag-gesture-handler> 横向滑动时触发
<long-press-gesture-handler> 长按时触发

# 工作原理

手势组件为虚组件,真正响应事件的是其直接子节点。下方代码中,我们给 container 节点添加了两种类型的手势监听。

  1. 当在屏幕上横向滑动时,horizontal-drag 手势节点的回调将被触发;
  2. 当在屏幕上纵向滑动时,vertical-drag 手势节点的回调将被触发。
<horizontal-drag-gesture-handler>
  <vertical-drag-gesture-handler>
     <view id="container"></view>
  </vertical-drag-gesture-handler>
</horizontal-drag-gesture-handler>

触摸屏幕时,渲染引擎会从内到外对手势监听器进行手势识别,当某个手势监听器满足条件时,其余的手势监听器将会失效。如在 scroll-view 内部添加纵向的手势监听时,将会阻断 scroll-view 内的手势监听器,导致无法滑动。

<scrol-view>
  <vertical-drag-gesture-handler>
     <view id="container"></view>
  </vertical-drag-gesture-handler>
</scroll-view>

需要注意的是,pan 类型的判定条件比 vertical-drag 要宽松,因此纵向滑动时,vertical-drag 将会响应,而 pan 则会失效。当横向滑动时,pan 类型则会响应。

<vertical-drag-gesture-handler>
  <pan-gesture-handler>
     <view id="container"></view>
  </pan-gesture-handler>
</vertical-drag-gesture-handler>

# 通用属性

属性 类型 默认值 必填 说明
tag string 声明手势协商时的组件标识
worklet:ongesture eventhandler 手势处理回调
worklet:should-response-on-move callback 手指移动过程中手势是否响应
worklet:should-accept-gesture callback 手势是否应该被识别
simultaneous-handlers Array<string> [] 声明可同时触发的手势节点
native-view string 代理的原生节点类型

native-view 支持的枚举值有 scroll-viewswiper。滚动容器纵向滚动时,使用 <vertical-drag-gesture-handler> 手势组件代理内部手势,横向滚动时,则使用 <horizontal-drag-gesture-handler>

  • eventhandler 类型是事件回调,无返回值
  • callback 类型是开发者注册到组件的回调函数,会在适当时机被执行以读取返回值
  • 所有的回调都只能传入一个 worklet 回调

# 事件回调参数

# worklet:should-response-on-move

返回的参数 pointerEvent 各字段如下。每次触摸移动时进行回调,返回 false 时,则对应的手势组件无法收到该次 move 事件。

属性 类型 说明
identifier number Touch 对象的唯一标识符
type string 事件类型
deltaX number 相对上一次,X 轴方向移动的坐标
deltaY number 相对上一次,Y 轴方向移动的坐标
clientX number 触点相对于可见视区左边缘的 X 坐标
clientY number 触点相对于可见视区上边缘的 Y 坐标
radiusX number 返回能够包围接触区域的最小椭圆的水平轴 (X 轴) 半径
radiusY number 返回能够包围接触区域的最小椭圆的垂直轴 (Y 轴) 半径
rotationAngle number 返回一个角度值,表示上述由radiusX 和 radiusY 描述的椭圆为了尽可能精确地覆盖用户与平面之间的接触区域而需要顺时针旋转的角度
force number 用户对触摸平面的压力大小
timeStamp number 事件触发的时间戳
Page({
  shouldResponseOnMove(pointerEvent) {
    'worklet'
    return false
  }
})

# worklet:should-accept-gesture

用法如下,框架手势识别生效时进行回调,由开发者决定手势是否生效。以 Pan 手势为例。

手指触摸屏幕时进入 State.Possible 状态,shouldAcceptGesture 返回 false 后进入 State.CANCELLED 状态,返回 true 后进入 State.Begin 状态,可继续接收手续 move 事件。

Page({
  shouldAcceptGesture() {
    'worklet'
    return false
  }
})

# worklet:ongesture

不同类型手势组件返回的参数如下

# tap / double-tap

属性 类型 说明
state number 手势状态
absoluteX number 相对于全局的 X 坐标
absoluteY number 相对于全局的 Y 坐标

# pan / vertical-drag / horizontal-drag

属性 类型 说明
state number 手势状态
absoluteX number 相对于全局的 X 坐标
absoluteY number 相对于全局的 Y 坐标
deltaX number 相对上一次,X 轴方向移动的坐标
deltaY number 相对上一次,Y 轴方向移动的坐标
velocityX number 手指离开屏幕时的横向速度(pixel per second)
velocityY number 手指离开屏幕时的纵向速度(pixel per second)

# scale

属性 类型 说明
state number 手势状态
focalX number 中心点相对于全局的 X 坐标
focalY number 中心点相对于全局的 Y 坐标
focalDeltaX number 相对上一次,中心点在 X 轴方向移动的坐标
focalDeltaY number 相对上一次,中心点在 Y 轴方向移动的坐标
scale number 放大或缩小的比例
horizontalScale number scale 的横向分量
verticalScale number scale 的纵向分量
rotation number 旋转角(单位:弧度)
velocityX number 手指离开屏幕时的横向速度(pixel per second)
velocityY number 手指离开屏幕时的纵向速度(pixel per second)
pointerCount number 跟踪的手指数
  • 多指滑动时,focalXfocalY 为多个触摸点中心焦点的坐标
  • 单指滑动时,pointerCount = 1,此时效果同 pan-gesture-handlerscale 手势是 pan 的超集。

# long-press

属性 类型 说明
state number 手势状态
absoluteX number 相对于全局的 X 坐标
absoluteY number 相对于全局的 Y 坐标
translationX number 相对于初始触摸点的 X 轴偏移量
translationY number 相对于初始触摸点的 Y 轴偏移量
velocityX number 手指离开屏幕时的横向速度(pixel per second)
velocityY number 手指离开屏幕时的纵向速度(pixel per second)

# force-press

属性 类型 说明
state number 手势状态
absoluteX number 相对于全局的 X 坐标
absoluteY number 相对于全局的 Y 坐标
pressure number 压力大小

# 手势状态

所有手势 worklet:ongesture 回调均会返回一个 state 状态字段。

enum State {
  // 手势未识别
  POSSIBLE = 0,
  // 手势已识别
  BEGIN = 1,
  // 连续手势活跃状态
  ACTIVE = 2,
  // 手势终止
  END = 3,
  // 手势取消
  CANCELLED = 4,
}

我们将手势分为如下两种类型:

  1. 离散手势:tapdouble-tap,仅触发一次
  2. 连续手势:其它类型的手势组件,随手指拖动会触发多次

tap-gesture-handler 手势组件返回的 state 始终为 1。

pan-gesture-handler 手势组件在一个完整的拖动过程中,state 会按如下方式改变

  1. 手指刚接触屏幕时,state = 0
  2. 移动一小段距离,pan 手势判定生效时,state = 1
  3. 继续移动,state = 2
  4. 手指离开屏幕 state = 3

由于嵌套的手势会产生冲突(仅有一个最终判定识别生效),因此连续手势 state 的变化可能有如下一些情景,开发者需要根据 state 值来处理一些异常情况。

  1. POSSIBLE -> BEGIN -> ACTIVE -> END 正常流程
  2. POSSIBLE -> BEGIN -> ACTIVE -> CANCELLED 提前中断
  3. POSSIBLE -> CANCELLED 手势未识别

并不是所有的连续手势均有 POSSIBLE 状态,如 scale-gesture-handler 手势组件,当双指触摸后松手,state 变化如下:

  1. 双指触摸屏幕,state = 1, pointerCount = 2
  2. 双指放大操作,state = 2, pointerCount = 2
  3. 双指离开屏幕,state = 3, pointerCount = 1,之后会相继回调 a. state = 1, pointerCount = 1 b. state = 2, pointerCount = 1 c. state = 3, pointerCount = 0

# 注意事项

  • 手势组件仅在 Skyline 渲染模式下才能使用
  • 手势组件为虚组件,不会进行布局,手势组件上设置 styleclass 是无效的
  • 手势组件仅能含有一个直接子节点,否则不生效
  • 手势组件的父组件样式会直接影响其子节点
  • 手势组件的回调函数均需声明为 worklet 函数
  • 手势不同于普通 touch 事件,不会进行冒泡
  • 手势组件的 eventhandler / callback 均需声明为 worklet 函数,回调在 UI 线程触发

# 使用方法

# 示例代码

在开发者工具中预览效果

# Chaining API init 函数示例代码

在开发者工具中预览效果

# 示例一:监听拖动手势

<pan-gesture-handler on-gesture-event="handlePan">
  <view></view>
</pan-gesture-handler>
Page({
  handlePan(evt) {
    "worklet";
    console.log(evt.translateX);
  },
});

# 示例二:监听嵌套的手势

<horizontal-drag-gesture-handler on-gesture-event="handleHorizontalDrag">
  <vertical-drag-gesture-handler on-gesture-event="handleVerticalDrag">
    <view class="circle">one-way drag</view>
  </vertical-drag-gesture-handler>
</horizontal-drag-gesture-handler>

# 示例三:代理原生组件内部手势

对于 <scroll-view><swiper> 这样的滚动容器,内部也是基于手势来处理滚动操作的。相比于 webskyline 提供了更底层的访问机制,使得在做一些复杂交互时,可以做到更细粒度、分阶段的控制。

<vertical-drag-gesture-handler
  native-view="scroll-view"
  should-response-on-move="shouldScrollViewResponse"
  should-accept-gesture="shouldScrollViewAccept"
  on-gesture-event="handleGesture"
>
  <scroll-view
    scroll-y
    type="list"
    adjust-deceleration-velocity="adjustDecelerationVelocity"
    bindscroll="handleScroll"
  >
    <view class="item" wx:for="{{list}}">
      <view class="avatar" />
      <view class="comment" />
    </view>
  </scroll-view>
</vertical-drag-gesture-handler>

以纵向滚动的 <scroll-view> 为例,可使用 <vertical-drag-gesture-handler> 手势组件,并声明 native-view="scroll-view" 来代理其内部手势。

# 滚动事件

当滚动列表时,手势组件的事件回调和 <scroll-view>scroll 事件回调均会触发,它们的区别在于:

  1. scroll 事件仅在滚动时触发,当触顶/底后,不再回调
  2. on-gesture-event 手势回调当手指在屏幕上滑动时会一直触发,直到松手

# 手势控制

在前面介绍连续手势状态时,我们知道手势有自身的识别过程。例如 vertical-drag 手势,当手指触摸时为 POSSIBLE 状态,移动一小段距离后才识别为 BEGIN 状态,此时称手势被识别(ACCEPT)。

# 1. 手势识别

should-accept-gesture 属性允许开发者注册一个 callback,并返回一个布尔值,参与到手势识别的过程。当返回 false 时,本次触摸手势不再生效,相关联的 <scroll-view> 组件也无法滚动。

# 2. 事件派发

should-response-on-move 属性允许开发者注册一个 callback,并返回一个布尔值,参与到事件派发的过程。当返回 false 时,当次 move 的事件不再派发,相关联的 <scroll-view> 不继续滚动。该回调在手指移动过程中会持续触发,可随时改变,进而控制滚动容器继续/暂停滚动。

Page({
  // 这里返回 false,则 scroll-view 无法滚动
  // should-accept-gesture 会在手势识别的一开始触发一次
  // should-response-on-move 是在 move 过程中不断触发
  shouldScrollViewAccept() {
    'worklet'
    return true
  },

  // 这里返回 false,则 scroll-view 无法滚动
  shouldScrollViewResponse(pointerEvent) {
    'worklet';
    return true;
  },

  // 手指滑动离开滚动组件时,指定衰减速度
  adjustDecelerationVelocity(velocity) {
    'worklet';
   return velocity;
  },

  // scroll-view 滚动到边界后,手指滑动,scroll 事件不再触发
  handleScroll(evt) {
    'worklet';
  },

  // scroll-view 滚动到边界后,手指滑动,手势回调仍然会触发
  handleGesture(evt) {
    'worklet'
  },
});

# 示例四:手势协商

一些场景下,我们会遇到手势冲突。如下代码所示,存在嵌套的 <vertical-drag-gesture-handler> 组件,我们希望 outer 手势组件来处理纵向的拖动,inner 手势组件处理列表的滚动,但实际仅 inner 的手势回调会触发。

嵌套的同类型手势组件,当内层的手势识别后,外层的手势组件将不会被识别。

<vertical-drag-gesture-handler tag="outer">
  <vertical-drag-gesture-handler tag="inner" native-view="scroll-view">
    <scroll-view scroll-y></scroll-view>
  </vertical-drag-gesture-handler>
</vertical-drag-gesture-handler>

但上述场景又是很常见的,例如视频号的评论列表,列表的滚动和整个评论区的拖动衔接的十分流畅。手势协商机制用于解决该类问题,使用上也十分简单,simultaneous-handlers 属性声明多个手势可同时触发。

<vertical-drag-gesture-handler tag="outer" simultaneous-handlers="{{["inner"]}}">
  <vertical-drag-gesture-handler tag="inner" simultaneous-handlers="{{["outer"]}}" native-view="scroll-view">
    <scroll-view scroll-y></scroll-view>
  </vertical-drag-gesture-handler>
</vertical-drag-gesture-handler>

此时,outerinner 手势组件的 on-gesture-event 回调会依次触发,结合上面提到的手势控制原理,可以实现预期的效果。完整代码参考示例 demo

张学良为什么叫小六子 固涩是什么意思 牙周炎是什么 人上人是什么意思 食物中毒用什么药
乘务长是干什么的 青色是什么色 2031年是什么年 欢子真名叫什么 猪巴皮是什么材质
为什么人死后要盖住脸 impress是什么意思 词牌名什么意思 赵构为什么杀岳飞 蓦然是什么意思
断桥铝是什么意思 嘴馋是什么意思 左耳烫代表什么预兆 中空是什么意思 胃热口干口苦口臭吃什么药好
5月3号是什么星座hcv8jop4ns0r.cn 至死不渝下一句是什么hcv9jop2ns7r.cn 医生五行属什么hcv8jop9ns7r.cn 什么是情人hcv8jop7ns2r.cn 五十路是什么意思hcv9jop0ns2r.cn
枸杞和什么一起泡水喝最好hcv7jop9ns7r.cn 皇家礼炮是什么酒hcv8jop8ns7r.cn 荠菜长什么样子图片hcv8jop8ns4r.cn 83年属什么hcv9jop1ns7r.cn 7月29号是什么日子shenchushe.com
大姨妈期间适合吃什么水果hcv8jop8ns1r.cn 遗精是什么意思hcv9jop6ns2r.cn 吃完榴莲不能吃什么hcv9jop7ns1r.cn 螃蟹吐泡泡是什么原因hcv9jop4ns0r.cn 炊饼是什么hcv8jop3ns5r.cn
铁锈是什么hcv8jop0ns2r.cn 韩红和张一山什么关系hcv8jop1ns1r.cn 四十岁月经量少是什么原因hcv7jop4ns7r.cn 何首乌长什么样子图片hcv8jop1ns2r.cn 胃气上逆吃什么药hcv8jop2ns8r.cn
百度