我一直在为我正在做的一个项目阅读span/Spannable类的文档。我一直对包含MARK
和POINT
的跨度的定义和用法感到困惑。
一个MARK
似乎在Doc中被定义为"附加"到一个角色的位置,而一个POINT
被定义为"粘"到一个角色。因此,当文本被改变时,MARK
不会移动,而当文本被改变时,POINT
会随着它所"粘"的字符移动。
这些定义似乎表明MARK
与INCLUSIVE
是同义的,POINT
与EXCLUSIVE
是同义的。
然而,情况并非如此,因为SPAN_MARK_MARK
和SPAN_POINT_POINT
都不是SPAN_INCLUSIVE_INCLUSIVE
或SPAN_EXCLUSIVE_EXCLUSIVE
的同义词。事实上,SPAN_INCLUSIVE_INCLUSIVE
和SPAN_MARK_POINT
是一样的,SPAN_POINT_MARK
和SPAN_EXCLUSIVE_EXCLUSIVE
是一样的。
我的问题如下
-
为什么
SPAN_POINT_MARK
和SPAN_EXCLUSIVE_EXCLUSIVE
是同义词?为什么SPAN_MARK_POINT
和SPAN_INCLUSIVE_INCLUSIVE
是同义词? -
为什么
SPAN_MARK_MARK
和SPAN_POINT_POINT
不分别与SPAN_INCLUSIVE_INCLUSIVE
和SPAN_EXCLUSIVE_EXCLUSIVE
同义? -
在这种用法中
MARK
和POINT
的真正定义是什么?
我喜欢解释MARK vs POINT的方式是用方括号表示它们在文本范围中存在的任何偏移量。括号所指向的方向表示该标记或点"附加"到的字符。
对于POINT,您将使用左括号-它附加在它后面的字符上。对于MARK,你可以使用右括号——它附在它前面的字符上。
让我们看看每种类型的一些例子:
SPAN_MARK_MARK
插入在0长度跨度的偏移量处:标记保持固定。<>之前[前][前][前][前]After: Lorem []INSERTipsum dolor sit。
在非0长度的span开始插入:插入的文本包含在该span的范围内。<>之前[前][前][前][前][/b] INSERTipsum]
在非0长度的span的末尾插入:插入的文本将被排除在该span的范围之外。<>之前[前][前][前][前]After: Lorem [ipsum]INSERT dolor sit。
从最后两个例子可以看出,为什么SPAN_MARK_MARK
标志与SPAN_INCLUSIVE_EXCLUSIVE
标志是同义的。插入在span开头的文本包括在范围内,而插入在span末尾的文本不包括在范围内。
SPAN_POINT_POINT
插入在0长度跨度的偏移量处:点被向前推。<>之前以前:Lorem [[ipsum dolor sit]。After: Lorem INSERT[[ipsum dolor .]
在非0长度的span的开始插入:插入的文本将被排除在span的范围之外。<>之前以前:Lorem [ipsum[dolor sit]。After: Lorem INSERT[ipsum]
插入在非0长度的span的末尾:插入的文本包含在该span的范围内。<>之前以前:Lorem [ipsum[dolor sit]。After: Lorem [ipsumINSERT]
从最后两个例子中,您可以再次看到为什么SPAN_POINT_POINT
标志与SPAN_EXCLUSIVE_INCLUSIVE
标志同义。插入在span开头的文本将被排除在范围之外,而插入在span末尾的文本将被包括在内。
SPAN_MARK_POINT
插入在span的开头:插入的文本包含在范围内。<>之前以前:Lorem]ipsum[悲伤,悲伤]INSERTipsum[/b]
插入到span的末尾:插入的文本仍然包含在范围内。<>之前以前:Lorem]ipsum[悲伤,悲伤]After: Lorem]ipsumINSERT
因此它有同义词SPAN_INCLUSIVE_INCLUSIVE
——插入的文本总是包含在span的范围内。
SPAN_POINT_MARK
插入在span的开头:插入的文本被排除在范围之外。<>之前以前:Lorem [ipsum] dolor sit。After: Lorem INSERT[ipsum]
插入到span的末尾:插入的文本仍然被排除在范围之外。<>之前以前:Lorem [ipsum] dolor sit。After: Lorem [ipsum]INSERT dolor sit。
因此它有同义词SPAN_EXCLUSIVE_EXCLUSIVE
——插入的文本总是被排除在span的范围之外。
我认为文档通过拆分一些同义词的定义来使事情变得混乱。例如,在描述SPAN_MARK_MARK
时,他们只根据0长度的跨度来定义它的用法。然后,在定义SPAN_INCLUSIVE_EXCLUSIVE
(这是一个同义词)时,他们只根据非0长度的跨度来定义它的用法。我认为,如果他们事先声明它们是同义词,并且两个术语有一个共同的定义,那就清楚得多了。
它们是概念性的概念,按照它们出现的顺序来思考
From the docs:
MARK和POINT在概念上位于相邻的两个之间字符。MARK"附加"在前面的字符上,而A点后会粘到字符上。插入游标为概念上位于MARK和POINT之间。因此,在MARK和POINT之间插入一个新字符将离开MARK不变,而POINT将被移动,现在位于插入的字符,仍然粘到相同的字符后。取决于插入是发生在开始还是结束对于一个span,该span将因此被扩展以包含新的字符(当span在其开头使用MARK或POINT时),否则将被排除。注意,前后在这里引用字符串中的偏移量,它独立于视觉效果文本
的表示
你的观点
这些定义似乎表明MARK是INCLUSIVE的同义词这个点是EXCLUSIVE的同义词。
并非如此。基本上可以把标记作为跨度的起始标记,而点作为端点。在这两点之间发生的事情(样式化,在样式化的文本上添加更多的文本等等)现在被归类为包容和排斥,因此与它们直接相关。
让我们看一个例子:假设我们有如下文本样式
这是一个示例文本
如果我们在黑体span上使用了SPAN_EXCLUSIVE_EXCLUSIVE,并且我们在span的中间插入了文本,它仍然是黑体:
这是一个非常好的例子 text
但是如果在黑体span的开头或结尾插入文本,则插入的文本不是黑体:
这不是一个例子文本
如果我们使用了SPAN_INCLUSIVE_EXCLUSIVE,那么在开头插入的文本将作为span的一部分被包括在内,我们将得到:
这是一个很好的例子文本,不是吗
现在所有这些只是我对文档的解释。为什么SPAN_POINT_MARK和SPAN_EXCLUSIVE_EXCLUSIVE是同义词,我想这是谷歌的某个人必须要评论的,但在我看来,MARK_POINT运动代表包容,而POINT_MARK代表排斥。SPAN_POINT_POINT和SPAN_MARK_MARK表示0长度字符串,因此不能归因于包含/排除。
:编辑:SPAN_MARK_MARK和SPAN_POINT_POINT都是0长度的字符串,即字符串从0位置的标记开始,然后任何后续的添加都附加到字符串上,但标记位置不会改变,或者字符串从点位置开始,任何后续的添加都将字符串的点移动到末尾。这些标志实际上表示起点是一个可伸缩的字符串,因此表示0长度的字符串。然后,可以根据字符串是mark_mark还是point_point开始使用包含或排除标志。还有SPAN_EXCLUSIVE_INCLUSIVE,当长度为0时,表现得像标记,当长度为0时,表现得像点,这从它们的定义方式中可以明显看出。这是我对docs