SPAN_POINT_MARK和SPAN_MARK_POINT有什么区别?

Eni*_*dan 13 android spanned spannable

我一直在阅读我正在研究的项目的Spanned/Spannable类的文档.我对包含MARK和包含的跨度的定义和用法感到困惑POINT.

A MARK似乎在Doc中被定义为"附加"到角色的位置,而a POINT被定义为"粘合"到角色.因此,MARK当文本被更改时,a POINT将不会移动,并且当文本被更改时,它将随着"粘合"的字符移动.

这些定义似乎表明它MARK是同义词,INCLUSIVEPOINT就是同义词EXCLUSIVE.

然而,这并不像既不的情况下SPAN_MARK_MARK,也不SPAN_POINT_POINT是具有任一同义SPAN_INCLUSIVE_INCLUSIVESPAN_EXCLUSIVE_EXCLUSIVE.实际上,SPAN_INCLUSIVE_INCLUSIVE是一样的SPAN_MARK_POINT,SPAN_POINT_MARK也是一样的SPAN_EXCLUSIVE_EXCLUSIVE.

我的问题如下

  1. 为什么是SPAN_POINT_MARK同义词SPAN_EXCLUSIVE_EXCLUSIVE?为什么是SPAN_MARK_POINT同义词SPAN_INCLUSIVE_INCLUSIVE

  2. 为什么不SPAN_MARK_MARK和和分别SPAN_POINT_POINT是同义词?SPAN_INCLUSIVE_INCLUSIVESPAN_EXCLUSIVE_EXCLUSIVE

  3. 什么是真正的定义,MARKPOINT在这种用法?

Jam*_*ess 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长度跨度来定义其用法.我认为如果他们事先声明他们是同义词并且两个术语共享一个单一的定义,那将会更加清晰.


Sla*_*ast 5

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

来自文档:

MARK和POINT在概念上位于两个相邻字符之间.MARK之前是一个"附加"的角色,而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位置的标记开始,然后任何后续添加附加到字符串但标记位置不会改变,或者字符串以点位置开始,并且任何后续添加到string将点移向末尾.这些标志实际上表示起始点是一个spannable字符串,因此表示0长度字符串.然后可以使用包含的独占标志,具体取决于字符串是mark_mark还是point_point开头.另外SPAN_EXCLUSIVE_INCLUSIVE,当0长度时,表现得像标记和SPAN_INCLUSIVE_EXCLUSIVE,当0长度表现得像点,从定义它们的方式很明显.这是我对文档的解释