多点触控使用指导

← 返回多点触控组件参考 · 全部使用指导

多点触控使用指导

不可见组件:同时追踪最多 10 个触摸点——每个手指按下、移动、松开都触发事件,并带上「触摸点序号」和坐标; 同时识别常用手势:滑动(上下左右)、双击、长按、双指缩放、双指旋转。 可用于画布(左右互搏、双人对战、多指绘画、缩放旋转图片)、按钮(多个按钮同时按住做游戏手柄、按按下位置分区控制)、 图像和布局等可见组件。

触摸点序号从 1 开始:按下时分配当前最小的空闲序号,松开时回收,按住移动期间不变。 例如依次按下左手食指、右手食指、右手中指,序号分别是 1、2、3;松开右手食指后 2 号被回收, 此时再按下一个手指,它得到的序号仍是 2。用序号就能分清「哪根手指在动」。 坐标与画布「被按压」「被拖动」等事件同一单位,相对组件左上角。

注册到画布或按钮后,它们自己的触摸事件(被按压、被拖动、被点击等)照常触发,互不影响。 由原 GestureDetector 拓展的多点触控、滑动、缩放、旋转四个组件合并内化而来,一次注册全部可用。

快速上手:左右互搏

「左手画方、右手画圆」——左半边画红线、右半边画蓝线,两只手同时画;双击清空画布。

  1. 拖一个画布(宽、高都设为充满)和一个多点触控到屏幕,屏幕方向建议锁定横屏;
  2. 搭下面的代码块:按下时按位置给这根手指记一个颜色,移动时用它的颜色画线。

各案例独立使用;组合到同一屏幕时,将同名事件的处理合并到一个事件积木中。

global 笔色 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

when Screen1.Initialize() {
  多点触控1.Register(画布1)
  画布1.LineWidth = 12
}

when 多点触控1.TouchDown(组件, 触摸点序号, x坐标, y坐标) {
  if x坐标 < 画布1.Width / 2 {
    笔色[触摸点序号] = &HFFE53935
  } else {
    笔色[触摸点序号] = &HFF1E88E5
  }
}

when 多点触控1.TouchMoving(组件, 触摸点序号, 起点X坐标, 起点Y坐标, 前点X坐标, 前点Y坐标, 当前X坐标, 当前Y坐标) {
  画布1.PaintColor = 笔色[触摸点序号]
  画布1.DrawLine(前点X坐标, 前点Y坐标, 当前X坐标, 当前Y坐标)
  画布1.DrawCircle(当前X坐标, 当前Y坐标, 6, true)
}

when 多点触控1.DoubleTapped(组件, x坐标, y坐标) {
  画布1.Clear()
}

运行后两只手同时在左右两边画,左边的线是红色、右边是蓝色,互不串色;双击画布清空。 画完线再画一个小圆,是为了把粗线转折处的缝隙填平。

手势:缩放、旋转、滑动

在画布上放一个图像精灵(勾选「旋转」),双指捏合缩放、双指转动旋转;单指快速滑动在标签上显示方向:

global 基准宽 = 100
global 基准高 = 100
global 基准角 = 0

when 多点触控1.TouchDown(组件, 触摸点序号, x坐标, y坐标) {
  if 多点触控1.PointerCount(画布1) == 2 {
    基准宽 = 图像精灵1.Width
    基准高 = 图像精灵1.Height
    基准角 = 图像精灵1.Heading
  }
}

when 多点触控1.Pinched(组件, 缩放倍数, 中心X坐标, 中心Y坐标) {
  图像精灵1.Width = 基准宽 * 缩放倍数
  图像精灵1.Height = 基准高 * 缩放倍数
}

when 多点触控1.Rotated(组件, 角度) {
  图像精灵1.Heading = 基准角 - 角度
}

when 多点触控1.Swiped(组件, 方向) {
  标签1.Text = join("滑动方向:", 方向)
}

缩放倍数、旋转角度都相对「第二根手指按下时」计算,所以在按下第二根手指时记下原尺寸、原角度,之后直接乘、加即可。 图像精灵的方向是逆时针为正,而旋转角度是顺时针为正,所以用减法。

常见问题

现象 检查
事件完全不触发 是否在屏幕初始化时注册(组件)(Register)了这个组件;启用(Enabled)是否为真
两根手指的线串色 颜色要按触摸点序号记,不要只用一个全局变量
滑动事件没触发 需要较快地划过至少 50 个单位;慢慢拖动只会触发「触摸点移动」
注册滑动条或 Web浏览框 报错 这两种组件自己要处理触摸,不支持注册
想做游戏手柄(两个按钮同时按住) 把两个按钮都注册,在「被按压」「被松开」里按组件参数区分是哪个按钮

搭建与测试

在设计器拖入本组件和案例涉及的按钮、标签、布局等组件,按案例中的名称重命名。先运行最小案例,确认事件返回,再增加业务逻辑。示例中的素材先上传到项目,服务器地址、令牌、文件路径换成自己的值。

可见组件需要有非零宽高;不可见工具组件必须由属性或方法启动。设计器展示样式不等于运行时已加载数据或绑定目标。联机测试应使用包含本组件的 AI 伴侣;涉及系统入口或权限的行为还要编译安装后验证。

案例:暂停手势识别

准备一个有尺寸的垂直布局、标签和开关按钮,Register 后监听布局上的触摸手势。

when Screen1.Initialize() {
  多点触控1.Register(垂直布局1)
}
when 按钮_暂停.Click() {
  多点触控1.Enabled = false
}
when 按钮_恢复.Click() {
  多点触控1.Enabled = true
}
when 多点触控1.LongPressed(组件, x坐标, y坐标) {
  标签1.Text = join("长按位置:", x坐标, ",", y坐标)
}

注册对象要有可触摸的尺寸;滚动组件可能争抢触摸事件。不同事件中的 pointerId 是触摸点编号,不是第几根手指的固定序号。

属性、方法与事件速查

完整参数类型、默认值和平台说明见组件参考。下表按调用入口列出用途;有完成事件的方法在事件中读取结果。

入口 用途
启用(Enabled) 是否启用多点触控与手势识别。关闭时不触发任何事件,并清空已按着的触摸点记录(不补发松开事件)。
触摸点数量(组件)(PointerCount) 返回当前有几个触摸点按在这个组件上。
触摸点X坐标(组件,触摸点序号)(PointerX) 返回某个触摸点当前的 X 坐标;它没按在这个组件上时返回 -1。适合在计时器里轮询。
触摸点Y坐标(组件,触摸点序号)(PointerY) 返回某个触摸点当前的 Y 坐标;它没按在这个组件上时返回 -1。适合在计时器里轮询。
注册(组件)(Register) 注册要追踪触摸的组件:画布、按钮、图像、布局等可见组件,可注册多个。一般在屏幕初始化时调用。滑动条和 Web浏览框 不支持(它们自己要处理触摸)。
双击时(组件,x坐标,y坐标)(DoubleTapped) 双击时触发,坐标为第二次点击的位置。
长按时(组件,x坐标,y坐标)(LongPressed) 长按时触发(手指按住不动约半秒)。
缩放时(组件,缩放倍数,中心X坐标,中心Y坐标)(Pinched) 双指缩放时触发。缩放倍数相对双指手势开始时计算:大于 1 为张开放大,小于 1 为捏合缩小,可直接乘到原尺寸上;中心为两指中点。
旋转时(组件,角度)(Rotated) 双指旋转时触发。角度相对双指手势开始时计算,顺时针为正,范围 -180 到 180,可直接加到原角度上。
滑动时(组件,方向)(Swiped) 单指快速滑过时触发。方向为 left(向左)、right(向右)、up(向上)或 down(向下)。
被按压时(组件,触摸点序号,x坐标,y坐标)(TouchDown) 手指在已注册的组件上按下时触发。触摸点序号从 1 开始:按下时分配当前最小的空闲序号,松开时回收,按住移动期间不变。坐标相对组件左上角。
触摸点移动时(组件,触摸点序号,起点X坐标,起点Y坐标,前点X坐标,前点Y坐标,当前X坐标,当前Y坐标)(TouchMoving) 按住的触摸点移动时触发(每个移动了的触摸点各触发一次)。起点是它按下的位置,前点是上一次的位置,当前点是现在的位置。
被松开时(组件,触摸点序号,x坐标,y坐标)(TouchUp) 触摸点松开(或触摸被系统取消)时触发,之后它的序号被回收。

常见问题与验收

检查项 操作与预期
初始化 对照案例检查是否已经调用加载、注册、连接或显示方法;仅拖入组件不会替你执行这些步骤。
结果返回 将成功事件和失败事件都接到标签,记录事件参数;异步操作完成前不读取结果属性。
输入配置 检查素材名大小写、网址是否为直接资源地址、文件是否存在、编号和索引是否在范围内。
平台与权限 按组件参考中的平台说明测试;授权被拒绝时应有明确提示,不继续假定操作成功。
最小案例 先验证页面中的最小案例,再验证第二个场景;重复操作、取消、返回屏幕后结果应符合事件说明。

完整 .aia 源码与操作指导

下载 .aia 源码

需要支持多点触控的真实设备。蓝色区域是手势目标;请在该区域操作,下方滚动用于查看控制项。缩放和旋转显示真实手势数据,不自动缩放界面。手指编号以事件返回值为准。

导入 MultiTouchAllFeatures.aia,连接最新伴侣,或编译独立安装包。真机/伴侣运行尚未实测。

API / 功能 操作入口 预期结果
Register / Enabled 设计器及读写 初始化,切换开关后点设置 只登记蓝色触摸标签,禁用后不派发触摸手势
TouchDown / TouchMoving / TouchUp 在蓝色区按下、移动、松开 显示真实组件、手指编号、坐标;移动显示起点、上次与当前
PointerCount / PointerX / PointerY 按下和移动事件中自动查询;点读取 查询实际点数与该手指坐标;无手指时点数0
Swiped 在蓝色区快速单指划动 显示组件给出的方向,不把普通慢拖动当快速滑动
DoubleTapped / LongPressed 双击/保持长按 展示真实手势坐标与事件计数
Pinched / Rotated 双指分开、合拢和旋转 展示缩放比例、中心和旋转角度;仅显示测量,不改标签外观

所有返回值均用于界面反馈,错误由底部错误区展示。设计器采用明确非默认配置,初始化与界面同步。API 覆盖检查按最终 AIA 检查方法、事件、属性读取与设置及设计器配置,不能替代真实设备验证。

多点触控

导入方法:项目 → 导入项目(.aia)→ 选择下载的 .aia 源码文件。 需要支持多点触控的真实设备。蓝色区域是手势目标;请在该区域操作,下方滚动用于查看控制项。缩放和旋转显示真实手势数据,不自动缩放界面。手指编号以事件返回值为准。 覆盖检查 15/15。首次载入及保存重开均0个错误,真实后台导入、安装包编译通过;真机/伴侣/硬件联调尚未实测。全部属性读写、方法与事件的操作入口和预期结果见组件指导。

文档反馈