领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

「按键教程」若干坐标点依次模拟人工滑动

nixiaole 2025-06-28 15:45:51 知识剖析 1 ℃

注明:本篇文章所有代码区均可向右拖动查看完整代码。



这是一个按照指定路径滑动的验证图,从1到4按照顺序滑动。通常我们会通过打码平台获取这几个点的坐标值,之后在进行模拟人工滑动,今天这篇文章就是关于滑动这部分的内容。


在讲解这个之前我们先来理解一个概念:相对坐标和绝对坐标。下面我们结合图例来说一下:


(一)绝对坐标:


这个坐标是我们平时最常用的坐标。



图中①位置的坐标是188,386,它的数值是根据它和模拟器屏幕(手机屏幕)左上角的距离得到的。


(二)相对坐标。



同样还是①这个位置,坐标变成了183,74,这个坐标是相对于红框左上角的位置得到,也就是把方框左上角当做(0,0)。我们通过打码平台得到坐标数值,因为平台只是收到你的图片截图,并不知道图片在你手机屏幕的什么位置,所以只能是给你相对于图片左上角的坐标。


(三)相对坐标怎么转换成绝对坐标。


用相对坐标加上你的截图时截图范围的左上角坐标值,就是绝对坐标了。

还是上图,①点的相对坐标是(183,74),图片左上角坐标是(5,312)

那么绝对坐标计算方法(183+5,74+312),计算结果得到绝对坐标是(188,386)。


接下来讲滑动这部分内容:


先介绍一下坐标返回值:183,74|342,177|205,223|332,76

这些坐标都是相对于图片左上角的相对坐标。



图片的截图的位置坐标(5,312)



下面开始滑动方式,我们从简到难的介绍,涉及到的滑动命令:

TouchDown x1, y1, 1
TouchDown x2, y2, 1, 100
TouchUp 1


(一)固定值滑动


先计算出每一个点的绝对坐标,然后从1开始滑动3次。

Dim x0=5,y0=312 //截图对应的左上角坐标
Dim 返回值="183,74|342,177|205,223|332,76"
Dim 点数组=split(返回值,"|")
Dim 点1=split(点数组(0),",")
Dim 点1x=点1(0)+x0
Dim 点1y=点1(1)+y0
Dim 点2=split(点数组(1),",")
Dim 点2x=点2(0)+x0
Dim 点2y=点2(1)+y0
Dim 点3=split(点数组(2),",")
Dim 点3x=点3(0)+x0
Dim 点3y=点3(1)+y0
Dim 点4=split(点数组(3),",")
Dim 点4x=点4(0)+x0
Dim 点4y=点4(1)+y0

TouchDown 点1x, 点1y, 1
TouchMove 点2x, 点2y, 1, 1000
TouchMove 点3x, 点3y, 1, 1000
TouchMove 点4x, 点4y, 1, 1000
TouchUp 1



(二)循环滑动


上面的方法虽然直观,但是代码看着略显臃肿,并且每个点具有规律性,所以可以用循环来写。


Dim x0=5,y0=312
Dim 返回值="183,74|342,177|205,223|332,76"
Dim 点数组=split(返回值,"|")
For i = 0 To UBOUND(点数组)
Dim 坐标=split(点数组(i),",")
  If i = 0 Then 
    TouchDown 坐标(0) + x0, 坐标(1) + y0, 1
    Else 
    TouchMove 坐标(0) + x0, 坐标(1) + y0, 1, 1000
  End If
Next



(三)固定分段滑动


所谓分段滑动,就是把两点之间加几个点,并且点不在一条直线上,形成折线的效果。



以上图为例,两点之间分成了4段,假设是4等分,中间3个拐点的坐标计算方法是:

第1个拐点:点①+(点②-点①)*25%

第2个拐点:点①+(点②-点①)*50%

第3个拐点:点①+(点②-点①)*75%


为了不让每个拐点都在一条直线上,得到坐标加上一个随机数,范围是(-5,5)。

Dim x0=5,y0=312
Dim x,y
Dim 返回值="183,74|342,177|205,223|332,76"
Dim 点数组=split(返回值,"|")
For i = 0 To UBOUND(点数组)
    Dim 坐标=split(点数组(i),",")
    If i = 0 Then 
        x = 坐标(0) + x0
        y = 坐标(1) + y0
        TouchDown x, y, 1
    Else 
        TouchMove x + (坐标(0) + x0 - x) * 0.25+rand(), y + (坐标(1) + y0 - y) * 0.25+rand(), 1, 500
        TouchMove x + (坐标(0) + x0 - x) * 0.5+rand(), y + (坐标(1) + y0 - y) * 0.5+rand(), 1, 500
        TouchMove x + (坐标(0) + x0 - x) * 0.75 + rand(), y + (坐标(1) + y0 - y) * 0.75 + rand(), 1, 500
        TouchMove 坐标(0) + x0, 坐标(1) + y0, 1, 500
        x = 坐标(0) + x0
        y = 坐标(1) + y0
    End If
Next

Function rand()
  rand=int(11*rnd()-5)
End Function



可以看到线条有一定的弯曲度了,不再是直线。


(四)自定义分段数滑动


上面说的是4段,其实也可以用循环来实现

Dim x0=5,y0=312
Dim x,y
Dim 返回值="183,74|342,177|205,223|332,76"
Dim 点数组=split(返回值,"|")
For i = 0 To UBOUND(点数组)
    Dim 坐标=split(点数组(i),",")
    If i = 0 Then 
        x = 坐标(0) + x0
        y = 坐标(1) + y0
        TouchDown x, y, 1
    Else 
       For j = 1 To 4 
          TouchMove x + (坐标(0) + x0 - x) * (j/4)+rand(), y + (坐标(1) + y0 - y) * (j/4)+rand(), 1, 500
       Next
        x = 坐标(0) + x0
        y = 坐标(1) + y0
    End If
Next

Function rand()
  rand=int(11*rnd()-5)
End Function


在代码中的4就是段数



如果用变量表示,就可以控制段数了。来写个分8段看看


Dim x0=5,y0=312
Dim x,y
Dim 段数=8
Dim 返回值="183,74|342,177|205,223|332,76"
Dim 点数组=split(返回值,"|")
For i = 0 To UBOUND(点数组)
    Dim 坐标=split(点数组(i),",")
    If i = 0 Then 
        x = 坐标(0) + x0
        y = 坐标(1) + y0
        TouchDown x, y, 1
    Else 
       For j = 1 To 段数 
          TouchMove x + (坐标(0) + x0 - x) * (j/段数)+rand(), y + (坐标(1) + y0 - y) * (j/段数)+rand(), 1, 500
       Next
        x = 坐标(0) + x0
        y = 坐标(1) + y0
    End If
Next

Function rand()
  rand=int(11*rnd()-5)
End Function



段数越多,线条越曲折,不过需要注意如果每一段用时是固定的话,段数越多用时越长,这样也不好,所以把段数和用时也做关联性。


来个28段的效果。

Dim x0=5,y0=312
Dim x,y
Dim 段数=28
Dim 返回值="183,74|342,177|205,223|332,76"
Dim 点数组=split(返回值,"|")
For i = 0 To UBOUND(点数组)
    Dim 坐标=split(点数组(i),",")
    If i = 0 Then 
        x = 坐标(0) + x0
        y = 坐标(1) + y0
        TouchDown x, y, 1
    Else 
       For j = 1 To 段数 
          TouchMove x + (坐标(0) + x0 - x) * (j/段数)+rand(), y + (坐标(1) + y0 - y) * (j/段数)+rand(), 1, int(2000/段数)
       Next
        x = 坐标(0) + x0
        y = 坐标(1) + y0
    End If
Next

Function rand()
  rand=int(11*rnd()-5)
End Function



最后我们来封装个函数


Dim x0=5,y0=312
Dim 段数=28
Dim 返回值="183,74|342,177|205,223|332,76"

Call 分段滑动(返回值, x0, y0, 段数)

Function 分段滑动(返回值, x0, y0, 段数)
    Dim x,y
    Dim 点数组=split(返回值,"|")
    For i = 0 To UBOUND(点数组)
        Dim 坐标=split(点数组(i),",")
        If i = 0 Then 
            x = 坐标(0) + x0
            y = 坐标(1) + y0
            TouchDown x, y, 1
        Else 
            For j = 1 To 段数 
                TouchMove x + (坐标(0) + x0 - x) * (j/段数)+rand(), y + (坐标(1) + y0 - y) * (j/段数)+rand(), 1, int(2000/段数)
            Next
            x = 坐标(0) + x0
            y = 坐标(1) + y0
        End If
    Next
End Function

Function rand()
    rand=int(11*rnd()-5)
End Function


大功告成,整篇文章的内容就是我在编写这段代码时的思考过程。有时候代码不是一蹴而就的,而是不断修改完善,最终实现自己想要的效果。

最近发表
标签列表