GKD规则编写之选择器-2
关系选择器
上一篇讲完了属性选择器
,现在来讲关系选择器
关系选择器
用于连接两个属性选择器
,可以回忆一下1+2的例子,+号就是所谓关系选择器
。
关系选择器
由两部分构成,分别是:关系操作符
和关系表达式
关系操作符
关系操作符
,用于指示查找节点的方向
打个比方,将所有的节点比作一个大家庭,那么这个家庭里面就肯定会有兄弟姐妹、祖先后人。那么关系操作符
就是用来描述两个节点间的关系。
关系操作符
有5种:+
、-
、>
、<
、<<
+
+
操作符,表示前置兄弟节点。
何为前置兄弟节点?
这里给一个样例:A + B
用回那个比喻,A跟B就是家里的两兄弟,而且他们是“相邻”的兄弟(“相邻”的兄弟就是指大哥和二哥、三哥和四哥这样的数字相邻的兄弟)
A是大哥,B就是二哥
只能匹配相邻的兄弟节点,那岂不是很鸡肋?
放心,在讲完关系表达式
后,就不会让你觉得鸡肋了
-
-
操作符,表示后置兄弟节点。
还是那个样例,不过把+
换成-
变成:A - B
A和B还是家里的两兄弟,也还是“相邻”兄弟,但是现在:
B是大哥,A是二哥
总的来说,可以类比数学的逆运算,-
操作符就是+
操作符的逆运算
>
>
操作符,表示祖先节点。
有请助教样例大哥:A > B
祖先节点,字面意思:就是谁是谁祖先
那么看到样例,A是B的祖先,很好理解吧
但是祖先也有辈分之分啊,这个样例中,A就是B的爸爸(没错,你可以管你的爸爸叫祖先)
还是那句话,讲完关系表达式
就可以解锁更高级操作了
<
<
操作符,表示直接子节点
还是助教大哥:A < B
还是按照字面理解:谁是谁儿子
样例中表达的就是:A节点是B节点儿子
<<
<<
操作符,表示子孙节点
不说了,懂得都懂:A << B
还是字面意思:谁是谁的子孙,也就是谁是谁的后代
样例就是:A是B的后代
关系表达式
关系表达式分两种,元组表达式
和多项式表达式
。关系表达式被()
括起来,并且位于关系操作符的后方
元组表达式
元组表达式
由有序递增的正整数组成,可以理解为数学中的数列
下面是几个元组表达式
:
(1)
(1,2,3,4,5)
(2,4,6)
多项式表达式
多项式表达式
中的多项式
就是数学中的一元一次多项式,在多项式表达式
中以n为未知数
从本质来说,多项式表达式
是元组表达式
的另一种表达方式
这个元组的数字满足集合
{an+b|an+b>=1,n>=1}(a,b是常整数)
如果集合为空集则表达式非法
那么,根据初中数学相关知识,我们可以知道:
- 当a<=0时,存在一个等价的有限
元组表达式
,如:(-n+4)
等价于(1,2,3)
(-3n+10)
等价于(1,4,7)
- 当a>0时,存在一个等价的无限
元组表达式
,如:(n)
等价于(1,2,3,...)
(2n-1)
等价于(1,3,5,...)
关系选择器
将 关系操作符 和 关系表达式 连接起来就得到了 关系选择器
用法解释
以下是5个关系选择器
:
A +5 B
A -5 B
A >3 B
A <3 B
A <<n B
对于A +5 B
,就是说:A是大哥,B就是六哥
同样的,对于A -5 B
,A是六哥,B是大哥
对于A >3 B
,A是爷爷(设为第1代),B是曾孙子(则B为第4代)
但是A <3 B
有些许不同,不知道你有没有注意到:在介绍<
关系操作符时,子
字被加粗了。
因为A <3 B
并不是曾孙子与爷爷的关系,而是三哥与爸爸的关系,即:A是B的三儿子
对于A <<n B
,A是B的祖先,由于它的多项式表达式
是(n)
,等价的元组表达式
就是(1,2,3,...)
,所以可以找到A的所有B祖先
定义
还记得上一篇讲过的属性名
吗?其中的index
、depth
是确定两个节点之间关系的关键
A +(a1,a2,a3,a_n) B
: A.index 满足 B.index-(a_m), 其中 a_m 是元组的任意一个数字
A -(a1,a2,a3,a_n) B
: A.index 满足 B.index+(a_m)
A >(a1,a2,a3,a_n) B
: A.depth 满足 B.depth-(a_m), 根节点的 depth=0
A <(a1,a2,a3,a_n) B
: A.index 满足 a_m-1
A <<(a1,a2,a3,a_n) B
: A.order 满足 a_m-1, A.order(无法通过网页审查工具得知) 是深度优先先序遍历的索引 (搭配 quickFind 使用)
所以,确定两个节点的关系关键在于index
和depth
的值,而不是单纯的数户口。
例如:现在有2个FrameLayout
,其中一个的index
值是0,另一个的index
值是3,但是它们在网页审查工具中是相邻的节点。如果你要使用-
关系操作符选中index
为3的FrameLayout
,这时规则就不能写成@FrameLayout[index=3] - FrameLayout[index=0]
了,而应写成@FrameLayout[index=3] -3 FrameLayout[index=0]
。当然,实际中写成FrameLayout[index=3]
会更好。
简写
当 a=0 或 b=0 时, 括号可以省略, 比如
A +(3n+0) B
->A +(3n) B
->A +3n B
,A +(0n+3) B
->A +(+3) B
->A +3 B
当 a=0 且 b=1 时, an+b 可以省略, 比如
A <(0n+1) B
->A < B
, 此外A + B
,A > B
都与等价的 css 语法语义相同当 a=1 且 b=0 且操作符是
>
, 可以进一步简写, 比如A >(1n+0) B
->A >n B
->A B
, 这与等价的 css 语法语义相同
当然,不简写也是可以的,就是会丧失一些代码的简洁性
后记
那么,GKD规则编写之选择器的教程就到此结束,也欢迎在评论区留言探讨。
如果本教程有什么谬误,或者对本教程有什么建议的话,也欢迎在下方评论区给出你的建议。
本篇教程不算太完善,以后会慢慢优化的。
那么,祝你写的规则不会误触,不会失效!