SPAN_POINT_MARK和SPAN_MARK_POINT有什么区别?

时间:2013-05-13 21:35:14

标签: android spannable spanned

我一直在阅读我正在研究的项目Spanned/Spannable课程的文档。我对包含MARKPOINT的范围的定义和用法感到困惑。

MARK似乎在文档中定义为“附加”到角色的位置,而POINT被定义为“粘合”到角色。因此,当文本发生更改时,MARK将不会移动,并且POINT将随着文本更改时“胶合”的字符移动。

这些定义似乎表明MARKINCLUSIVE同义,POINTEXCLUSIVE同义。

但是,情况并非如此,因为SPAN_MARK_MARKSPAN_POINT_POINT都不是SPAN_INCLUSIVE_INCLUSIVESPAN_EXCLUSIVE_EXCLUSIVE的同义词。事实上,SPAN_INCLUSIVE_INCLUSIVESPAN_MARK_POINT相同,SPAN_POINT_MARKSPAN_EXCLUSIVE_EXCLUSIVE相同。

我的问题如下

  1. 为什么SPAN_POINT_MARKSPAN_EXCLUSIVE_EXCLUSIVE同义?为什么SPAN_MARK_POINTSPAN_INCLUSIVE_INCLUSIVE同义?

  2. 为什么SPAN_MARK_MARKSPAN_POINT_POINT分别与SPAN_INCLUSIVE_INCLUSIVESPAN_EXCLUSIVE_EXCLUSIVE同义?

  3. 此用法中MARKPOINT的真实定义是什么?

2 个答案:

答案 0 :(得分:14)

我喜欢解释MARK vs POINT的方法是将它们表示为方括号,以及它们在一系列文本中存在的任何偏移量。括号指向的方向显示标记或点“附加”的字符。

因此对于POINT,您将使用开括号 - 它附加到跟随它的字符。对于MARK,你可以使用近括号 - 它附加在它前面的字符上。

让我们看一下每种类型的一些例子:

<强> SPAN_MARK_MARK

在0长度范围的偏移处插入:标记保持固定。

Before: Lorem ]]ipsum dolor sit.
After:  Lorem ]]INSERTipsum dolor sit.

在非0长度范围的开头插入:插入的文本包含在范围的范围内。

Before: Lorem ]ipsum] dolor sit.
After:  Lorem ]INSERTipsum] dolor sit.

在非0长度范围的末尾插入:插入的文本将从范围的范围中排除。

Before: Lorem ]ipsum] dolor sit.
After:  Lorem ]ipsum]INSERT dolor sit.

从最后两个示例中可以看出,为什么SPAN_MARK_MARK标志与SPAN_INCLUSIVE_EXCLUSIVE标志同义。在范围开始处插入的文本包含在范围内,而在末尾插入的文本将被排除。

<强> SPAN_POINT_POINT

在0长度范围的偏移处插入:向前推动点。

Before: Lorem [[ipsum dolor sit.
After:  Lorem INSERT[[ipsum dolor sit.

在非0长度范围的开头插入:插入的文本从范围的范围中排除。

Before: Lorem [ipsum[ dolor sit.
After:  Lorem INSERT[ipsum[ dolor sit.

在非0长度范围的末尾插入:插入的文本包含在范围的范围内。

Before: Lorem [ipsum[ dolor sit.
After:  Lorem [ipsumINSERT[ dolor sit.

再次,您可以从最后两个示例中看到为什么SPAN_POINT_POINT标志与SPAN_EXCLUSIVE_INCLUSIVE标志同义。在范围的开头插入的文本将从范围中排除,而包含在末尾的文本则包括在内。

<强> SPAN_MARK_POINT

在范围的开头插入:插入的文本包含在范围内。

Before: Lorem ]ipsum[ dolor sit.
After:  Lorem ]INSERTipsum[ dolor sit.

在范围的末尾插入:插入的文本仍包含在范围内。

Before: Lorem ]ipsum[ dolor sit.
After:  Lorem ]ipsumINSERT[ dolor sit.

因此它具有同义词SPAN_INCLUSIVE_INCLUSIVE - 插入的文本始终包含在范围的范围内。

<强> SPAN_POINT_MARK

在范围的开头插入:插入的文本将从范围中排除。

Before: Lorem [ipsum] dolor sit.
After:  Lorem INSERT[ipsum] dolor sit.

在范围的末尾插入:插入的文本仍然从范围中排除。

Before: Lorem [ipsum] dolor sit.
After:  Lorem [ipsum]INSERT dolor sit.

因此它具有同义词SPAN_EXCLUSIVE_EXCLUSIVE - 插入的文本始终从范围的范围中排除。

我认为文档通过拆分某些同义词的定义来混淆事物。例如,在描述SPAN_MARK_MARK时,它们仅根据0长度范围定义其用法。然后,在定义SPAN_INCLUSIVE_EXCLUSIVE(它是同义词)时,它们仅根据非0长度跨度定义其用法。如果他们事先声明他们是同义词,并且两个术语共享一个定义,我认为会更清楚。

答案 1 :(得分:5)

它们是概念性概念,并按它们出现的顺序来考虑它们

来自文档:

  

MARK和POINT在概念上位于两个相邻的位置之间   字符。 MARK之前是一个“附加”的角色,而a   POINT会坚持到后面的角色。插入光标是   概念上位于MARK和POINT之间。结果是,   在MARK和POINT之间插入一个新字符将离开   MARK不变,而POINT 将被移位,现在位于   插入的字符仍然粘贴在它后面的相同字符。   取决于插入是在开头还是结尾   跨度,跨度将因此扩大到包括新的   字符(当跨度在其开头使用MARK或POINT时   在它的最后)或它将被排除在外。注意这里之前和之后   引用String中的偏移,它们独立于视觉   文本的表示

你的观点

  

这些定义似乎表明MARK与INCLUSIVE同义   并且POINT是EXCLUSIVE的同义词。

事实并非如此。基本上将标记视为范围的起始标记,将视为端点。这两点之间发生了什么(样式,向样式文本添加更多文本等)现在被归类为包容性和排他性,因此直接与它们相关联。

让我们看一个例子: 假设我们有以下文字样式

  

这是示例文字

如果我们在粗体跨度上使用SPAN_EXCLUSIVE_EXCLUSIVE,并且我们在跨度的中间插入文本,它仍然是粗体:

  

这是一个令人难以置信的好例子文本

但是如果我们在粗体跨度的开头或末尾插入文本,插入文本不是粗体字:

  

这不是示例文字

如果我们使用SPAN_INCLUSIVE_EXCLUSIVE,那么在开头插入文本将作为范围的一部分包含在内,我们将拥有:

  

相当一个例子文字不是

现在这一切只是我对文档的解释。为什么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位置的标记开始,然后任何后续添加都附加到字符串但标记位置不会改变,或者字符串以点位置开始,并且对字符串的任何后续添加都会移动指向最后。这些标志实际上表示起始点是一个spannable字符串,因此表示0长度字符串。然后可以使用包含的独占标志,具体取决于字符串是mark_mark还是point_point开头。另外SPAN_EXCLUSIVE_INCLUSIVE,当0长度时,表现得像标记和SPAN_INCLUSIVE_EXCLUSIVE,当0长度表现得像点,这从他们被定义的方式很明显。这是我对文档的解释