android上实时多点找色,多点找色进阶 - 【201512期】

多点找色进阶

60c2a87930771bc91226ca1864cc03dc.gif

80f33ce0f7d9486acc35b89aa5f9c2a1.gif

7b724837237fa0536b07afb51933b27c.gif横幅.gif(3.77 K)

2015/12/23 17:27:56

本文由按键学院提供技术支持

按键学院交流①群(已满):376122403按键学院交流②群(已满):372671254按键学院交流③群(快满):170084238按键学院安卓①群:115768679多点找色作为写脚本最常见的命令之一,基本上在所有脚本中都有用到,功能也很清楚,就是在指定的范围内找到根据我们设定的相对点颜色寻找满足条件的界面特征,并返回寻找到的第一个特征的坐标,相比于找图,具有简单方便的优势(不需要截图再放到附件),还能够支持多分辨率的自适应,并且能够根据参数来设定搜索顺序,他如此之强----但我还想让他更强,有时候,我们在界面上寻找的特征不止一个,我希望能全部找出来,那么我们需要来小小的改动一下多点找色。

60c2a87930771bc91226ca1864cc03dc.gif

394a69d759799feb062581e758e78ef0.png

7b724837237fa0536b07afb51933b27c.gif分隔线.jpg(3.25 K)

2015/12/23 17:27:56

恩,怎么说呢!直接贴代码!

Function 返回多个点的坐标数组(sx, sy, ex, ey, 主颜色,次颜色,搜索次序,相似度)

If sx = 0 and sy = 0 Then

If ex = 0 and ey = 0 Then

ex = GetScreenX()

ey = GetScreenY()

End If

End If

KeepCapture

Dim TickCount()

Dim intX,intY

Dim arrx = Array()

Dim arry = Array()

Dim num =0

Dim 范围 = 获取大小(次颜色)

For i = sx To ex Step 范围(0)

For j = sy To ey Step 范围(1)

FindMultiColor i,j,i+范围(0)-1,j+范围(1)-1, 主颜色, 次颜色, 搜索次序,相似度,intX,intY

If intX > -1 Then

arrx(num) = intX

arry(num) = intY

num = num + 1

End If

Next

Next

Dim arrxy = Array(arrx,arry,num)

返回多个点的坐标数组 = arrxy

ReleaseCapture

End Function

Function 获取大小(str)

Dim arr = Split(str,",")

Dim xy = Array()

Dim x = 0

Dim y = 0

Dim i = 0

For Each n In arr

Dim 第一个位置 = InStr(1, n, "|")

If Int(Left(n,第一个位置 - 1)) > x Then

x = Int(Left(n,Instr(1,n,"|")-1))

End If

Dim n2 = StrCut(n, 1,第一个位置)

Dim 第二个位置 = InStr(1, n2, "|")

If Int(Left(n2,第二个位置 - 1)) > y Then

y = Int(Left(n2,第二个位置 - 1))

End If

Next

xy = Array(x,y)

获取大小 = xy

End Function

Dim t = TickCount()

Dim arr = 返回多个点的坐标数组(0,0,0,0,"BAB7B4-101010", "98|0|B9B7B0-101010,98|98|B7B4AF-101010,0|98|B5B4B0-101010", 0, 0.9)

For i = 0 To arr(2)-1

TracePrint arr(0, i) & "," & arr(1, i)

Next

TracePrint TickCount() - t复制代码

我们注意到多点找色含有范围,那么我们直接在这个范围上下功夫,进行多次范围寻找,再将每次的坐标记录下来,记录到一个数组中,最后返回这个数组,就实现了返回多个坐标,那么问题就在于这个范围如何判定,我们当然可以将这个范围改成单个的像素点,然后遍历整个屏幕,但是这样会产生2个问题,一是时间,这种方式遍历一遍需要10来秒,这还是因为我使用的720*1280的分辨率,如果是1080*1920,那么可能要半分钟,这么低的效率即使找到也毫无意义,二是返回的点,我们一般取的点为了适用多分辨率,都会取在大色块的中间,那么就有可能同一个特征返回多个坐标,这虽然逻辑上没有问题,却不符合我们的需求。因此逐像素的方式不靠谱,我们需要自己去设定这个范围。

这里呢,我采用根据取的点的最大宽高的值来作为范围,这样可以解决上述方式的两个缺点,问题就是写法麻烦点,并且取点也要相对谨慎(第一个点最好在所有取的点的左上方来保证所有偏移量都是正数,当然也可以通过代码来解决这个问题,你们可以根据这个自己改写~),当然这是一次写好终生受益的事情,之后可以直接使用“返回多个点的坐标数组”这个函数而不需要了解他内部实现的方法。

代码中我寻找的点为图标的四个角落的点:

60c2a87930771bc91226ca1864cc03dc.gif

5755dfd83694b9c7386e24f8d1a9ee52.png

7b724837237fa0536b07afb51933b27c.gif1.png(33.65 K)

2015/12/23 17:27:56

恩,放大点瞧瞧:

60c2a87930771bc91226ca1864cc03dc.gif

4a08c50092a21d1c1c1d21f30e44af7a.png

7b724837237fa0536b07afb51933b27c.gif2.png(8.54 K)

2015/12/23 17:27:56

这里为了更加清晰我寻找了边缘点,大家取点请尽量取色块中间的点哦。好了,我们来看看整个图中,有多少这样的图标呢?

60c2a87930771bc91226ca1864cc03dc.gif

ce8a81e63f43a3a8d08e5d3596851c3a.png

7b724837237fa0536b07afb51933b27c.gif3.png(35.95 K)

2015/12/23 17:27:56

根据肉眼看到的,应该是7个,分别是第一排的4个和第二排的3个,那么运行一下看看,返回了什么:

60c2a87930771bc91226ca1864cc03dc.gif

8fc1d04c5be13c85940fa302320c535d.png

7b724837237fa0536b07afb51933b27c.gif4.png(53.74 K)

2015/12/23 17:27:56

可以看出,确实返回了所有的坐标,使用的时间为49毫秒,这个延时完全可以接受。唔,哪里能更好的实验出他的强大呢?还记得我们之前的双11之连连看吗?双11抢红包连连看源码分析-【201511期】我们就可以使用这个方法,不断的返回两个坐标并点击就能够实现,并且速度更加快速哦!

想知道更多内容吧!那么请关注院刊系列!

60c2a87930771bc91226ca1864cc03dc.gif

7b724837237fa0536b07afb51933b27c.gif微信关注引导.jpg(29.91 K)

2015/12/23 17:27:56

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值