YYPOST群发软件 发表于 2026-8-17 06:25:37

AIWROK双指向中间滑动捏合手势完整示例


AIWROK双指向中间滑动捏合手势完整示例











/**
* ============================================================
* AIWROK - 双指向中间滑动(捏合手势)完整示例
* ============================================================
* 核心功能:
*   1. auto.dispatchGesture()—— 同时执行多条路径,实现多点触控
*   2. new path() + setDurTime() + addPoint() —— 构建单根手指的滑动轨迹
*
* 手势说明:
*   - 捏合(缩小):左指向右滑 + 右指向左滑,两指同时向中间靠拢
*   - 放大(张开):左指向左滑 + 右指向右滑,两指同时向外分开(附带示例)
* ============================================================
*/

function main() {
    print.log("========== 双指向中间滑动(捏合手势)示例 ==========");

    // =====================================================
    //第一步:获取屏幕尺寸,使用百分比坐标适配所有机型
    // =====================================================
    var screenW = 1080;
    var screenH = 1920;
    try {
      if (typeof screen !== 'undefined') {
            if (typeof screen.getScreenWidth === 'function')screenW = screen.getScreenWidth();
            if (typeof screen.getScreenHeight === 'function') screenH = screen.getScreenHeight();
      } else if (typeof device !== 'undefined') {
            if (typeof device.width === 'number')screenW = device.width;
            if (typeof device.height === 'number') screenH = device.height;
      }
    } catch (e) {
      print.log("获取屏幕尺寸失败,使用默认值: " + e);
    }
    print.log("屏幕尺寸: " + screenW + " x " + screenH);
    sleep.millisecond(500);

    // =====================================================
    //示例 1:水平方向双指捏合(向中间滑动,缩小图片用)
    //左指:屏幕左侧 1/4 处 → 屏幕中间
    //右指:屏幕右侧 3/4 处 → 屏幕中间
    // =====================================================
    print.log("\n--- 示例1: 水平捏合(向中间滑动,缩小)---");
    {
      // 左指路径:从左 1/4 → 中间
      var pathLeft1 = new path();
      pathLeft1.setDurTime(600);
      pathLeft1.addPoint(screenW * 0.25, screenH * 0.5);   // 起点
      pathLeft1.addPoint(screenW * 0.45, screenH * 0.5);   // 终点(中间偏左)

      // 右指路径:从右 1/4 → 中间
      var pathRight1 = new path();
      pathRight1.setDurTime(600);
      pathRight1.addPoint(screenW * 0.75, screenH * 0.5);// 起点
      pathRight1.addPoint(screenW * 0.55, screenH * 0.5);// 终点(中间偏右)

      // 同时传入两个 path 对象 → 双指同时滑动
      var ok1 = auto.dispatchGesture();
      print.log(ok1 ? "✓ 水平捏合执行成功" : "✗ 水平捏合执行失败");
    }
    sleep.second(1);

    // =====================================================
    //示例 2:垂直方向双指捏合(上指下滑 + 下指上滑 → 向中间)
    // =====================================================
    print.log("\n--- 示例2: 垂直捏合(向中间滑动)---");
    {
      var pathTop = new path();
      pathTop.setDurTime(600);
      pathTop.addPoint(screenW * 0.5, screenH * 0.25);   // 顶部起点
      pathTop.addPoint(screenW * 0.5, screenH * 0.45);   // 向中间滑

      var pathBottom = new path();
      pathBottom.setDurTime(600);
      pathBottom.addPoint(screenW * 0.5, screenH * 0.75);// 底部起点
      pathBottom.addPoint(screenW * 0.5, screenH * 0.55);// 向中间滑

      var ok2 = auto.dispatchGesture();
      print.log(ok2 ? "✓ 垂直捏合执行成功" : "✗ 垂直捏合执行失败");
    }
    sleep.second(1);

    // =====================================================
    //示例 3:对角线捏合(左上+右下同时向中心靠拢)
    // =====================================================
    print.log("\n--- 示例3: 对角线捏合(左上+右下 → 中心)---");
    {
      var pathLT = new path();
      pathLT.setDurTime(700);
      pathLT.addPoint(screenW * 0.15, screenH * 0.2);   // 左上角
      pathLT.addPoint(screenW * 0.42, screenH * 0.46);    // 中心左上区域

      var pathRB = new path();
      pathRB.setDurTime(700);
      pathRB.addPoint(screenW * 0.85, screenH * 0.8);   // 右下角
      pathRB.addPoint(screenW * 0.58, screenH * 0.54);    // 中心右下区域

      var ok3 = auto.dispatchGesture();
      print.log(ok3 ? "✓ 对角线捏合执行成功" : "✗ 对角线捏合执行失败");
    }
    sleep.second(1);

    // =====================================================
    //示例 4:放大手势(与捏合相反,双指向外分开)
    //作为对比参考,方便理解方向
    // =====================================================
    print.log("\n--- 示例4: 水平放大(双指向外分开)---");
    {
      var pathLeft4 = new path();
      pathLeft4.setDurTime(600);
      pathLeft4.addPoint(screenW * 0.45, screenH * 0.5);// 中间偏左
      pathLeft4.addPoint(screenW * 0.20, screenH * 0.5);// 滑向左边

      var pathRight4 = new path();
      pathRight4.setDurTime(600);
      pathRight4.addPoint(screenW * 0.55, screenH * 0.5); // 中间偏右
      pathRight4.addPoint(screenW * 0.80, screenH * 0.5); // 滑向右边

      var ok4 = auto.dispatchGesture();
      print.log(ok4 ? "✓ 水平放大执行成功" : "✗ 水平放大执行失败");
    }
    sleep.second(1);

    // =====================================================
    //示例 5:封装好的通用函数调用
    // =====================================================
    print.log("\n--- 示例5: 调用封装函数 pinchHorizontal() ---");
    pinchHorizontal(0.2, 0.8, 0.5, 0.5, 800);   // 从 20% 和 80% 位置向中间捏合
    sleep.second(1);

    print.log("\n========== 示例全部执行完成 ==========");
}

// ============================================================
//封装函数:水平捏合(双指向中间滑动)
//参数:
//    leftStartXPercent : 左指起点 X 的百分比 (0~1)
//    rightStartXPercent: 右指起点 X 的百分比 (0~1)
//    yPercent          : 捏合中心线的 Y 百分比 (0~1)
//    convergePercent   : 向中间收敛到的位置(0.5 = 正中心)
//    duration          : 持续时间(毫秒)
// ============================================================
function pinchHorizontal(leftStartXPercent, rightStartXPercent, yPercent, convergePercent, duration) {
    try {
      var w = 1080, h = 1920;
      if (typeof screen !== 'undefined') {
            if (typeof screen.getScreenWidth=== 'function') w = screen.getScreenWidth();
            if (typeof screen.getScreenHeight === 'function') h = screen.getScreenHeight();
      }

      var y = h * yPercent;
      var cx = w * convergePercent;

      // 左指:起点 → 中心左侧(留出一点间距不撞车)
      var pL = new path();
      pL.setDurTime(duration);
      pL.addPoint(w * leftStartXPercent, y);
      pL.addPoint(cx - w * 0.05, y);

      // 右指:起点 → 中心右侧
      var pR = new path();
      pR.setDurTime(duration);
      pR.addPoint(w * rightStartXPercent, y);
      pR.addPoint(cx + w * 0.05, y);

      var result = auto.dispatchGesture();
      print.log("水平捏合 " + (result ? "成功" : "失败")
                  + " [" + (leftStartXPercent*100).toFixed(0) + "%→" + ((convergePercent-0.05)*100).toFixed(0) + "%"
                  + ", " + (rightStartXPercent*100).toFixed(0) + "%→" + ((convergePercent+0.05)*100).toFixed(0) + "%]");
      return result;
    } catch (e) {
      print.log("水平捏合异常: " + e);
      return false;
    }
}

// ============================================================
//封装函数:垂直捏合(上指下滑 + 下指上滑)
// ============================================================
function pinchVertical(topStartYPercent, bottomStartYPercent, xPercent, convergePercent, duration) {
    try {
      var w = 1080, h = 1920;
      if (typeof screen !== 'undefined') {
            if (typeof screen.getScreenWidth=== 'function') w = screen.getScreenWidth();
            if (typeof screen.getScreenHeight === 'function') h = screen.getScreenHeight();
      }

      var x = w * xPercent;
      var cy = h * convergePercent;

      var pT = new path();
      pT.setDurTime(duration);
      pT.addPoint(x, h * topStartYPercent);
      pT.addPoint(x, cy - h * 0.05);

      var pB = new path();
      pB.setDurTime(duration);
      pB.addPoint(x, h * bottomStartYPercent);
      pB.addPoint(x, cy + h * 0.05);

      var result = auto.dispatchGesture();
      print.log("垂直捏合 " + (result ? "成功" : "失败"));
      return result;
    } catch (e) {
      print.log("垂直捏合异常: " + e);
      return false;
    }
}

// ============================================================
//封装函数:通用双指捏合(任意起点 + 指定收敛中心)
//    start1 : 起点1 {x, y} (百分比 0~1)
//    start2 : 起点2 {x, y}
//    center : 收敛中心 {x, y} (百分比)
//    duration : 毫秒
// ============================================================
function pinchGeneric(start1, start2, center, duration) {
    try {
      var w = 1080, h = 1920;
      if (typeof screen !== 'undefined') {
            if (typeof screen.getScreenWidth=== 'function') w = screen.getScreenWidth();
            if (typeof screen.getScreenHeight === 'function') h = screen.getScreenHeight();
      }

      var p1 = new path();
      p1.setDurTime(duration);
      p1.addPoint(start1.x * w, start1.y * h);
      // 向中心靠近,但不到绝对中心(留 3% 间距,避免两指坐标相同被系统识别成单指)
      p1.addPoint(
            start1.x * w + (center.x * w - start1.x * w) * 0.85,
            start1.y * h + (center.y * h - start1.y * h) * 0.85
      );

      var p2 = new path();
      p2.setDurTime(duration);
      p2.addPoint(start2.x * w, start2.y * h);
      p2.addPoint(
            start2.x * w + (center.x * w - start2.x * w) * 0.85,
            start2.y * h + (center.y * h - start2.y * h) * 0.85
      );

      var result = auto.dispatchGesture();
      print.log("通用双指捏合 " + (result ? "成功" : "失败"));
      return result;
    } catch (e) {
      print.log("通用捏合异常: " + e);
      return false;
    }
}

main();


页: [1]
查看完整版本: AIWROK双指向中间滑动捏合手势完整示例