CN108710601A - 一种文本显示方法及其设备、存储介质、电子设备 - Google Patents
一种文本显示方法及其设备、存储介质、电子设备 Download PDFInfo
- Publication number
- CN108710601A CN108710601A CN201810457722.8A CN201810457722A CN108710601A CN 108710601 A CN108710601 A CN 108710601A CN 201810457722 A CN201810457722 A CN 201810457722A CN 108710601 A CN108710601 A CN 108710601A
- Authority
- CN
- China
- Prior art keywords
- text object
- text
- character
- width
- current line
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/103—Formatting, i.e. changing of presentation of documents
- G06F40/106—Display of layout of documents; Previewing
Abstract
本发明实施例公开了一种文本显示方法及其设备、存储介质、电子设备,其中方法包括如下步骤:获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。采用本发明,可以对齐显示文本对象,使得文本显示效果更加美观。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种文本显示方法及其设备、存储介质、电子设备。
背景技术
目前,市场上出现了各种各样的终端设备,在终端设备上可以安装各种应用程序,通过使用这些应用程序给人们的生活、工作和学习带来了极大的方便。
在显示应用程序的界面时,终端设备需要进行文本排版显示,而目前在排版上的处理规则是参照Unicode官方的排版标准,一般采用如下做法:从文本对象中读取一个字符,计算该字符的当前宽度,若当前行中的空白宽度大于该字符的当前宽度,则将该字符排在当前行(紧挨前一个字符),否则,该字符放在下一行的开头,并且,若发现标点符号“,、。”等排在一行的最后,则将该标点符号和它前面的一个字符都放在下一行。但按照这种排版规则所显示的文本对象行尾不整齐,从而使得显示效果不够美观。
发明内容
本发明实施例提供了一种文本显示方法及其设备、存储介质、电子设备,可以对齐显示文本对象,使得文本显示效果更加美观。
本发明实施例一方面提供了一种文本显示方法,可包括:
获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
可选的,所述获取所述初始文本对象中的当前行文本对象,包括:
获取所述初始文本对象中所有字符的第二总宽度;
基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象。
可选的,所述基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象,包括:
当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本行宽的第二差值小于所述设定阈值范围的最小值时,将所述初始文本对象确定为所述初始文本对象中的当前行文本对象;
当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。
可选的,所述截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象,包括:
当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;
当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
可选的,所述基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,包括:
当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,基于所述第一差值调整所述当前行文本对象中各字符的宽度;
当所述第一差值小于所述设定阈值范围的最小值时,采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。
可选的,所述基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行调整之后,还包括:
当检测到所述当前行文本对象中相邻两字符为第一字符与第二字符时,在所述相邻两字符之间插入设定宽度的空白空间,所述第一字符的字符类型与所述第二字符的字符类型不同。
可选的,所述基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整之后,还包括:
当检测到所述当前行文本对象中存在第一个字符或/和最后一个字符为设定类型的字符时,删除所述当前行文本对象中所述第一个字符或/和最后一个字符中的空格宽度,并移动所述第一个字符或/和最后一个字符。
可选的,还包括:
获取所述初始文本对象中各字符的字符格式;
将所述各字符以及所述各字符的字符格式保存至字符格式集合中。
可选的,所述显示所述目标文本对象,包括:
获取所述目标文本对象中各字符,在所述字符格式集合中查找当前字符的目标字符格式;
采用所述目标字符格式绘制所述当前字符;
生成包含所有绘制后的字符的目标文本对象,并显示所述目标文本对象。
本发明实施例一方面提供了一种文本显示设备,可包括:
行文本获取单元,用于获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
行文本调整单元,用于获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
所述行文本调整单元,还用于将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
目标文本显示单元,用于当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
可选的,所述行文本获取单元,包括:
第二总宽度获取子单元,用于获取所述初始文本对象中所有字符的第二总宽度;
行文本获取子单元,用于基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象。
可选的,所述行文本获取子单元,具体用于:
当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本行宽的第二差值小于所述设定阈值范围的最小值时,将所述初始文本对象确定为所述初始文本对象中的当前行文本对象;
当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。
可选的,所述行文本获取子单元,具体用于:
当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;
当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
可选的,所述行文本调整单元,具体用于:
当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,基于所述第一差值调整所述当前行文本对象中各字符的宽度;
当所述第一差值小于所述设定阈值范围的最小值时,采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。
可选的,所述设备还包括:
空白插入单元,用于当检测到所述当前行文本对象中相邻两字符为第一字符与第二字符时,在所述相邻两字符之间插入设定宽度的空白空间,所述第一字符的字符类型与所述第二字符的字符类型不同。
可选的,所述设备还包括:
字符移动单元,用于当检测到所述当前行文本对象中存在第一个字符或/和最后一个字符为设定类型的字符时,删除所述当前行文本对象中所述第一个字符或/和最后一个字符中的空格宽度,并移动所述第一个字符或/和最后一个字符。
可选的,所述设备还包括:
格式获取单元,用于获取所述初始文本对象中各字符的字符格式;
格式保存单元,用于将所述各字符以及所述各字符的字符格式保存至字符格式集合中。
可选的,所述目标文本显示单元,包括:
类型查找子单元,用于获取所述目标文本对象中各字符,在所述字符格式集合中查找当前字符的目标字符格式;
字符绘制子单元,用于采用所述目标字符格式绘制所述当前字符;
文本显示子单元,用于生成包含所有绘制后的字符的目标文本对象,并显示所述目标文本对象。
本发明实施例一方面提供了一种计算机存储介质,所述计算机存储介质存储有多条指令,所述指令适于由处理器加载并执行上述的方法步骤。
本发明实施例一方面提供了一种电子设备,可包括:处理器和存储器;其中,所述存储器存储有计算机程序,所述计算机程序适于由所述处理器加载并执行以下步骤:
获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
在本发明实施例中,通过获取初始文本对象,并获取该初始文本对象中的当前行文本对象,基于当前行文本对象中所有字符的第一总宽度与文本显示行宽的第一差值对当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象,并依次对齐调整其它行文本对象,在对所有行文本对象调整完成后,生成包含所有调整后的行文本对象的目标文本对象,并显示目标文本对象。通过将初始文本对象分割为至少一个行文本对象后,分别对每个行文本对象进行对齐调整,从而使得最终显示的文本对象行尾整齐,文本显示效果更加美观。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种文本显示方法的流程示意图;
图2是本发明实施例提供的一种文本截断规则表的界面示意图;
图3是本发明实施例提供的一种文本显示方法的流程示意图;
图4是本发明实施例提供的一种存储字符格式的List结构体示意图;
图5是本发明实施例提供的一种文本显示方法的流程示意图;
图6是本发明实施例提供的一种文本显示方法的流程示意图;
图7是本发明实施例提供的一种对齐调整后的目标文本对象的界面示意图;
图8a和8b是本发明实施例提供的一种空白空间删除前后的界面示意图;
图9是本发明实施例提供的一种行文本对象包括设定字符的场景示意图;
图10是本发明实施例提供的一种目标文本对象的显示效果示意图;
图11是本发明实施例提供的一种文本显示设备的结构示意图;
图12是本发明实施例提供的一种文本显示设备的结构示意图;
图13是本发明实施例提供的一种行文本获取单元的结构示意图;
图14是本发明实施例提供的一种目标文本显示单元的结构示意图;
图15是本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面将结合附图1-附图10,对本发明实施例提供的文本显示方法进行详细介绍。
请参见图1,为本发明实施例提供了一种文本显示方法的流程示意图。如图1所示,本发明实施例的所述方法可以包括以下步骤S101-步骤S104。
S101,获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
可以理解的是,所述初始文本对象是指未采用任何文本组件排版的文本内容。当采用文本组件对初始文本对象进行排版后,可将初始文本对象排列为至少一个行文本对象。所述初始文本对象中包括至少一个字符,所述字符可以包括文字、图片、链接、公式等各类型字符。
所述文本组件是用来显示字符的组件,其实质就是以设定的格式显示一块文本对象的区域。现有技术中常采用TextView组件显示文本对象,TextView可以显示丰富的文本信息,也可以显示图文并茂的混排页面。TextView的常用属性包括setText(),用于设置文本内容,同xml中的android:text;setTextSize(),用于设置文本字体大小,同xml中的android:textSize;setTextColor(),用于设置文本颜色,同xml中的android:textColor;setBackgroundColor(),用于设置背景颜色,同xml中的android:background等。
但TextView在排版上的处理规则是参照Unicode官方的排版标准,对于处理不能截断的数字或英文单词时,会将整串数字或英文换到下一行去显示,并且保证位于行首的字符不能为标点符号,以及对于连接符号(—,……)不能在中间截断,等诸多规则下实现文本对象的排版的,但显示效果不自然,通常文本对象的右侧不能保持对齐。因此,在本发明实施例中采用一种新的文本组件对初始文本对象进行显示。
具体实现中,文本显示设备获取所述初始文本对象中所有字符的第二总宽度,当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时(说明第二总宽度与文本显示行宽差距不大),或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值小于所述设定阈值范围的最小值时(说明第二总宽度比文本显示行宽小很多),将所述初始文本对象确定为所述初始文本对象中的当前行文本对象,当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时(说明第二总宽度比文本显示行宽大很多),截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。所述文本显示设备可以为用户终端,包括平板电脑、个人计算机(PC)、智能手机、掌上电脑以及移动互联网设备(MID)等具备文本编辑功能的终端设备;所述文本显示设备还可以为具备文本编辑功能的服务器。
其中,可基于所述初始文本对象中的可截断字符所在的位置或者文本显示行宽截断所述初始文本对象。具体为当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
例如,如图2所示为文本截断规则表,其中,oo表示可直接截断,ss表示只能在空格之后截断,cc表示有连接字符才可截断(如在连接字符后截断),xx表示不可截断。“OP、CL、…、EB”则表示字符属性,例如“OP”表示开放标点,如“(”,“[”,“{”等,“CL”表示闭标点符合,如“}”,“)”或“》”等,“CP”表示闭括弧,如“)”,“]”等,“QU”表示引号,“GL”表示不中断,“NS”表示非开始符,如“!!”,“?”,“??”,“!?”等,“EX”表示感叹号“!”或疑问号“?”,“SY”表示允许在前中断的符号“/”,“IS”表示数值分隔符“.”或者“,”等,“PR”表示前缀数字“$,£,¥”等,“PO”表示后缀数字“%,”,“NU”表示数值,“AL”表示字母,“ID”表示文字,“IN”表示不可分割的,如引线,“HY”表示连字符,“BA”表示在之后中断,“BB”表示在之前中断,“B2”表示在之前和之后中断,“ZW”表示零宽度空间,“CM”表示组合标记,“WJ”表示词连词,“H2”表示韩文LV音节,“H3”表示韩文LVT音节,“JL”表示韩文L连接符,“JV”表示韩文V连接符,“JT”表示韩文T连接符,“EB”表示表情符。该表中纵向代表前一个字符,横向代表后一个字符。若初始文本对象为“Welcome to 2018公开课。”,首先将“W”作为前一个字符,“e”作为后一个字符,基于图2可知“W”和“e”之间不可截断,依此方法依次查找该初始文本对象中的所有字符,从而确定该初始文本对象中的可截断字符集合{e、o、8、公、开},若“o”距离文本显示行宽右侧最近,则从“o”后的空格处截断,从而得到行文本对象为“Welcome to”和“2018公开课。”当然,如果“Welcome to 2018公开课。”中没有可截断字符,则基于文本显示行宽(比如2所在的位置)直接强制截断,从而得到行文本对象为“Welcome to 2”和“018公开课。”
所述获取所述初始文本对象中所有字符的第二总宽度,可以理解为,分别测量所述初始文本对象中每个字符的宽度,并将所测量的宽度相加。对于文字字符,可采用paint.measureText测量宽度,而对于图片字符或公式字符等非文字字符,可在预存的字符类型集合中获取该字符的宽度。
其中,采用paint.measureText测量字符宽度时具体如下:public static floatGetTextWidth(String text,float Size){//第一个参数是要测量的字符,第二个参数是字体大小}
TextPaint FontPaint=new TextPaint();
FontPaint.setTextSize(Size);
return FontPaint.measureText(text);}
需要说明的是,最终的返回值单位为像素(px,pixel)。
可选的,当所述初始文本对象中的各字符设置了格式时,所述初始文本对象实质上是一个SpannableString,通过getSpan的系统接口就可解析出初始文本对象中包含的格式Spann,并可采用一个List结构体将当前的Spann及对应的字符在初始文本对象中的位置信息存储起来,用于绘制文本时调用。
而所设置的格式则采用setSpan函数进行设置,setSpan(Object what,intstart,int end,int flags)需要输入四个参数,what表示设置的格式类型Spann,可以是前景色、背景色、也可以是可点击的文本等等,start表示需要设置格式的字符的开始位置,同理end表示结束位置以及flags参数,flags参数共有四种属性:Spanned.SPAN_INCLUSIVE_EXCLUSIVE(从开始位置到结束位置,包括开始位置);Spanned.SPAN_INCLUSIVE_INCLUSIVE(从开始位置到结束位置,同时包括开始位置和结束位置);Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(从开始位置到结束位置,但都不包括开始位置和结束位置);Spanned.SPAN_EXCLUSIVE_INCLUSIVE(从开始位置到结束位置,包括结束位置)。
S102,获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
可以理解的是,将初始文本对象分割为多个行文本对象后,获取当前行文本对象,并可采用上述方式测量当前行文本对象中各字符的宽度并相加,以得到当前行文本对象中所有字符的第一总宽度,或者直接基于上述测量结果得到当前行文本对象中所有字符的第一总宽度。
具体实现中,当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,表明当前行文本对象的字符宽度与文本显示行宽差距不大,那么基于所述第一差值调整所述当前行文本对象中各字符的宽度,从而使得当前行文本对象与文本组件右对齐;当所述第一差值小于所述设定阈值范围的最小值时,表明当前行文本对象的字符宽度与文本显示行宽的差距较大,那么需要采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,缩小当前行文本对象与文本显示行右侧的距离,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。
例如,若文本显示行宽为100像素,设定阈值范围为-5~5像素,第一总宽度为96像素,则将100-96=4个像素的宽度平均分配给当前行文本对象中的各字符,从而使得当前行文本对象与文本显示行宽右对齐。若第一总宽度为90像素,则基于所有行中宽度最小值(如93像素,那么宽度最小值为100-93=7),删除当前行中靠右侧的7个像素的空白空间。
可选的,可以通过直接重写系统文本组件的测量接口(onMeasure)以控制文本组件的实际宽度,并绘制接口(onDraw)以自动调整字间距,简单达到对齐效果。
S103,将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
可以理解的是,对于所分割的多个行文本对象,采用相同的方式逐行对齐调整,并在调整完当前行文本对象后跳转到下一个行文本对象。
例如,将初始文本对象分割为10个行文本对象A1~A10,若当前的行文本对象为A1,在对A1调整完成后,则跳转到A2,并将A2作为当前行文本对象,且采用与A1相同的方式进行对齐调整,并继续处理A3、A4、…、A10。
S104,当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
可以理解的是,在检测到不存在下一个行文本对象时,表明所有的行文本对象已经调整完成,则生成包含所有调整后的行文本对象的目标文本对象,依次绘制所述目标文本对象中的各字符并进行显示。
例如,当调整完A10后,所有的行文本都已经调整完成,则将调整后的A1~A10对应的文本对象作为目标文本对象进行显示。
优选的,当初始文本对象中的各字符设置了格式时,在绘制目标文本对象中的各字符时,需要获取所述目标文本对象中各字符,在所述字符格式集合中查找当前字符的目标字符格式,采用所述目标字符格式绘制所述当前字符,生成包含所有绘制后的字符的目标文本对象,并显示所述目标文本对象。所述字符格式集合中存储有所述初始文本对象中各字符以及各字符的字符格式。
在本发明实施例中,通过获取初始文本对象,并获取该初始文本对象中的当前行文本对象,基于当前行文本对象中所有字符的第一总宽度与文本显示行宽的第一差值对当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象,并依次对齐调整其它行文本对象,在对所有行文本对象调整完成后,生成包含所有调整后的行文本对象的目标文本对象,并显示目标文本对象。通过将初始文本对象分割为至少一个行文本对象后,分别对每个行文本对象进行对齐调整,从而使得最终显示的文本对象行尾整齐,文本显示效果更加美观。
请参见图3,为本发明实施例提供了一种文本显示方法的流程示意图。如图3所示,本发明实施例的所述方法可以包括以下步骤S201-步骤S212。
S201,获取所述初始文本对象中各字符的字符格式;
可以理解的是,所述初始文本对象是指未采用任何文本组件排版的文本内容。当采用文本组件对初始文本对象进行排版后,可将初始文本对象排列为至少一个行文本对象。所述初始文本对象中包括至少一个字符,所述字符可以包括中文、英文、数字、图片、链接、公式等各类型字符。
所述文本组件是用来显示字符的组件,其实质就是以设定的格式显示一块文本对象的区域。现有技术中常采用TextView组件显示文本对象,TextView可以显示丰富的文本信息,也可以显示图文并茂的混排页面。TextView的常用属性包括setText(),用于设置文本内容,同xml中的android:text;setTextSize(),用于设置文本字体大小,同xml中的android:textSize;setTextColor(),用于设置文本颜色,同xml中的android:textColor;setBackgroundColor(),用于设置背景颜色,同xml中的android:background等。
但TextView在排版上的处理规则是参照Unicode官方的排版标准,对于处理不能截断的数字或英文单词时,会将整串数字或英文换到下一行去显示,并且保证位于行首的字符不能为标点符号,以及对于连接符号(——,……)不能在中间截断,等诸多规则下实现文本对象的排版的,但显示效果不自然,通常文本对象的右侧不能保持对齐。因此,在本发明实施例中采用一种新的文本组件对初始文本对象进行显示。
当所述初始文本对象中的各字符设置了格式时,所述初始文本对象实质上是一个SpannableString,通过getSpan的系统接口就可解析出初始文本对象中包含的格式Spann,并可采用一个List结构体将当前的Spann及对应的字符在初始文本对象中的位置信息存储起来,用于绘制文本时调用。
而所设置的格式则采用setSpan函数进行设置,setSpan(Object what,intstart,int end,int flags)需要输入四个参数,what表示设置的格式类型Spann,可以是前景色、背景色、也可以是可点击的文本等等,start表示需要设置格式的字符的开始位置,同理end表示结束位置以及flags参数,flags参数共有四种属性:Spanned.SPAN_INCLUSIVE_EXCLUSIVE从开始位置到结束位置,包括开始位置;Spanned.SPAN_INCLUSIVE_INCLUSIVE从开始位置到结束位置,同时包括开始位置和结束位置;Spanned.SPAN_EXCLUSIVE_EXCLUSIVE从开始位置到结束位置,但都不包括开始位置和结束位置;Spanned.SPAN_EXCLUSIVE_INCLUSIVE从开始位置到结束位置,包括结束位置。
所述字符格式可以包括“ClickSpan、ImageSpan、BackgroundSpan、AbsoluteSizeSpan”等。
具体实现中,文本显示设备可依次遍历初始文本对象中的各字符,并通过getSpan的系统接口解析出遍历到的当前字符对应的字符格式Spann。所述文本显示设备可以为用户终端,包括平板电脑、个人计算机(PC)、智能手机、掌上电脑以及移动互联网设备(MID)等具备文本编辑功能的终端设备;所述文本显示设备还可以为具备文本编辑功能的服务器。
S202,将所述各字符以及所述各字符的字符格式保存至字符格式集合中;
可以理解为,将字符以及该字符对应的字符格式以映射关系表的形式对应保存至字符格式集合中,如表1所示。其中,所述各字符可以按照在初始文本对象中出现的先后顺序存储,也可以任意顺序存储,但需要在该映射关系表中存储每个字符的位置。
表1
1 | W | ClickSpan |
2 | e | ClickSpan |
3 | a | BackgroundSpan |
4 | r | BackgroundSpan |
5 | e | BackgroundSpan |
… | … |
一种优选的实现方式为,基于字符位置(第几个字符)以及字符格式存储,通过getSpan的系统接口解析出初始文本对象中包含了哪些字符格式Spann以及每个字符格式对应的字符位置,然后采用一个结构体进行存储,如List结构体,如图4所示,其中,0-3字符的字符格式为可点击格式ClickSpan,4-7字符为图片格式ImageSpan,8-12字符为添加了背景色格式BackgroundSpan,13-17字符为设置了字号大小格式AbsoluteSizeSpan。
所述结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。
在编程语言中List是标准类库中的一个类,可以简单视之为双向链表,以线性列的方式管理物件集合。List的特色是在集合的任何位置增加或删除元素都很快,但是不支持随机存取。List是类库提供的众多容器之一,除此之外还有vector、set、map、…等等。List以模板方式实现(即泛型),可以处理任意型态的变量,包括使用者自定义的资料型态,例如:可以是一个放置整数(int)型态的list、也可以是放置字串(char或string)型态的List、或者放置使用者自定类别(user-defined class)的List。在本发明实施例中,采用List存放结构体存储字符格式Spann以及每个字符格式对应的字符位置。
可选的,所述字符格式集合中还可存储图片、公式等非文字字符的宽度,以便在获取初始文本对象中各字符宽度时,直接调用所存储的非文字字符的宽度。
S203,获取初始文本对象,获取所述初始文本对象中所有字符的第二总宽度;
所述获取所述初始文本对象中所有字符的第二总宽度,可以理解为,分别测量所述初始文本对象中每个字符的宽度,并将所测量的宽度相加,将相加所得结果作为第二总宽度。对于文字字符,可采用paint.measureText测量宽度,而对于图片字符或公式字符等非文字字符,可在预存的字符格式集合中获取该字符的宽度。
其中,采用paint.measureText测量字符宽度时具体如下:public static floatGetTextWidth(String text,float Size){//第一个参数是要测量的字符,第二个参数是字体大小}
TextPaint FontPaint=new TextPaint();
FontPaint.setTextSize(Size);
return FontPaint.measureText(text);}
需要说明的是,最终的返回值单位为像素(px,pixel)。
S204,基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象;
可以理解的是,通过计算第二总宽度与文本显示行宽的差值,并比较该差值与设定阈值范围的大小,并依据比较结果确定所述初始文本对象中的当前行文本对象。
在一种具体的实现方式中,所述基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象可以包括以下步骤,如图5所示:
S301,当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值小于所述设定阈值范围的最小值时,将所述初始文本对象确定为所述初始文本对象中的当前行文本对象;
可以理解的是,当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,表明初始文本对象的字符宽度与文本显示行宽差距不大;当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值小于所述设定阈值范围的最小值时,表明初始文本对象的字符宽度小于文本显示行宽,那么通过一行可以显示完初始文本对象的所有字符,此时所述初始文本对象即为所述初始文本对象中的当前行文本对象。
例如,文本显示行宽为100像素,设定阈值范围为-5~5像素,若第二总宽度为96像素,此时,100-96=4属于-5~5像素范围内,那么初始文本对象可通过一行进行显示,则该初始文本对象即为当前行文本对象;若第二总宽度为80像素,此时,100-80=20<100-5=95,则该初始文本对象即为当前行文本对象。
S302,当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。
可以理解的是,当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,表明初始文本对象的字符宽度大于文本显示行宽,需要通过多行才可以显示完初始文本对象的所有字符,此时需要将初始文本对象截断为多个行文本对象,并将当前所选取的行文本对象确定为当前行文本对象。
若第二总宽度为350像素,则需要多行显示初始文本对象,因此可将该初始文本对象截断为多行文本对象,并将多行文本对象中当前对齐调整的行文本对象确定为当前行文本对象。
进一步的,所述截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象可以包括以下步骤,如图6所示:
S401,当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;
例如,如图2所示为文本截断规则表,其中,oo表示可直接截断,ss表示只能在空格之后截断,cc表示有连接字符才可截断(如在连接字符后截断),xx表示不可截断。“OP、CL、…、EB”则表示字符属性,例如“OP”表示开放标点,如“(”,“[”,“{”等,“CL”表示闭标点符合,如“}”,“)”或“》”等,“CP”表示闭括弧,如“)”,“]”等,“QU”表示引号,“GL”表示不中断,“NS”表示非开始符,如“!!”,“?”,“??”,“!?”等,“EX”表示感叹号“!”或疑问号“?”,“SY”表示允许在前中断的符号“/”,“IS”表示数值分隔符“.”或者“,”等,“PR”表示前缀数字“$,£,¥”等,“PO”表示后缀数字“%,”,“NU”表示数值,“AL”表示字母,“ID”表示文字,“IN”表示不可分割的,如引线,“HY”表示连字符,“BA”表示在之后中断,“BB”表示在之前中断,“B2”表示在之前和之后中断,“ZW”表示零宽度空间,“CM”表示组合标记,“WJ”表示词连词,“H2”表示韩文LV音节,“H3”表示韩文LVT音节,“JL”表示韩文L连接符,“JV”表示韩文V连接符,“JT”表示韩文T连接符,“EB”表示表情符。该表中纵向代表前一个字符,横向代表后一个字符。若初始文本对象为“Welcome to 2018公开课。”,首先将“W”作为前一个字符,“e”作为后一个字符,基于图2可知“W”和“e”之间不可截断,依此方法依次查找该初始文本对象中的所有字符,从而确定该初始文本对象中的可截断字符集合{e、o、8、公、开},若“o”距离文本显示行宽右侧最近,则从“o”后的空格处截断,从而得到行文本对象为“Welcome to”和“2018公开课。”需要说明的是,若“2018公开课。”通过一行不能显示完整,则需要采用上述相同的方法截断“2018公开课。”,从而再分割为两个行文本对象。选取截断后的文本对象中的任意一行或者第一行作为当前行文本对象。
S402,当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
如果“Welcome to 2018公开课。”中没有可截断字符,则基于文本显示行宽(比如2所在的位置)直接强制截断,从而得到行文本对象为“Welcome to 2”和“018公开课。”,选取截断后的文本对象中的任意一行或者第一行作为当前行文本对象。
S205,获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
可以理解的是,所述对齐调整是指将当前行文本对象与文本显示行的右侧对齐。
具体实现中,当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,基于所述第一差值调整所述当前行文本对象中各字符的宽度,以生成对齐调整后的行文本对象;当所述第一差值小于所述设定阈值范围的最小值时,采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,以生成对齐调整后的行文本对象,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。所述空白宽度是指每个行文本对象的右侧距离文本显示行右侧的宽度。
若文本显示行宽为100像素,设定阈值范围为-5~5像素,第一总宽度为96像素,则将100-96=4个像素的宽度平均分配给当前行文本对象中的各字符,从而使得当前行文本对象与文本显示行右对齐。例如,若将初始文本对象截断后得到的多个行文本对象,并基于每个行文本对象的字符总宽度与文本显示行宽的差值对每个行文本对象中各字符的宽度进行压缩或者扩宽,从而得到对齐后的文本对象,如图7所示。
若第一总宽度为90像素,则基于所有行中宽度最小值(如93像素,那么宽度最小值为100-93=7)删除当前行中靠右侧的7个像素的空白空间。例如,如图8a所示,将初始文本对象截断为两个行文本对象,第一行的空白宽度(图中方框所示)小于第二行的空白宽度,则删除第一行的空白宽度指示的空白空间,从而得到图8b所示的排版结果。
S206,当检测到所述当前行文本对象中相邻两字符为第一字符与第二字符时,在所述相邻两字符之间插入设定宽度的空白空间,所述第一字符的字符类型与所述第二字符的字符类型不同;
例如,所述第一字符为中文,第二字符为英文(你好hello蔡先生),或者第一字符为中文,第二字符为数字(你好1662编号),则需要在第一字符与第二字符之间插入空格,从而使得第一字符与第二字符的区分更明显。
具体实现中,依次遍历当前行文本对象中的各个字符,检测是否存在相邻两字符为不同的字符类型,若存在,则在该两个字符之间插入设定宽度(如1个英文字符宽度)的空格。
S207,当检测到所述当前行文本对象中存在第一个字符或/和最后一个字符为设定类型的字符时,删除所述当前行文本对象中所述第一个字符或/和最后一个字符中的空格宽度,并移动所述第一个字符或/和最后一个字符;
可以理解的是,所述设定类型的字符包括书名号、引号、括号等半封闭符号。
具体实现中,文本显示设备获取当前行中的一个字符或/和最后一个字符,并将获取到的字符与设定类型字符集合进行匹配,若存在匹配一致的字符,则将第一个字符的空格并将第一个字符左移或/和删除最后一个字符中的空格宽度并将最后一个字符右移,从而将当前行文本对象与文本显示行左对齐或/和右对齐。
例如,如图9所示,在第二个行文本对象中的第一个字符为“《”,则将该“《”移动到行顶,从而使该行的起始位置与文本显示行的左边距对齐。
需要说明的是,S207和S206的执行顺序不分先后,可以先后执行,也可同时执行。
可选的,对于初始文本对象中所包含的小语种(如阿拉伯文,泰文等),由于字形之间的关联性,有可能由于前一个字符不一样而导致下一个字符虽然一致,但是最终绘制出来的字形是不一样的,因此不需要调整小语种字符的字符宽度。其中,小语种可采用正则表达式进行识别。所述正则表达式是对字符串(包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
S208,将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
可以理解的是,对于所分割的多个行文本对象,采用相同的方式逐行对齐调整,并在调整完当前行文本对象后跳转到下一个行文本对象。
S209,当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象;
可以理解的是,在检测到不存在下一个行文本对象时,表明所有的行文本对象已经调整完成,则生成包含所有调整后的行文本对象的目标文本对象。
S210,获取所述目标文本对象中各字符,在所述字符格式集合中查找当前字符的目标字符格式;
具体实现中,文本显示设备读取目标文本对象中的字符,并依次遍历字符格式集合中的各个字符,当所读取的字符与在字符格式集合中遍历到的字符一致时,将该字符对应的字符格式确定为所读取到的字符的目标字符格式。其中,在遍历时,需要基于字符的位置,也就是说,若在字符格式集合中存在多个与读取到的字符一致的字符时,若直接将当前遍历到的字符对应的字符格式确定为目标字符格式,则有可能会发生错误,还需要考虑字符的位置以唯一准确确定当前读取到的字符的目标字符格式。
例如,对于“welcome”,若当前读取到的是m后的“e”,而在字符格式集合中所存储的w后的“e”的字符格式为ClickSpan,m后的“e”的字符格式为BackgroundSpan,若当前遍历到的是w后的“e”,而将ClickSpan作为目标字符格式则是错误的,因此,还需要考虑字符的位置,字符位置为7,则可以唯一确定当前读取到的字符的目标字符格式。
S211,采用所述目标字符格式绘制所述当前字符;
也就是说,将所确定的目标字符格式添加到当前字符上。例如,若确定的目标字符格式为BackgroundSpan,则在当前字符上添加背景色。进一步的,在所述字符格式中还可携带背景颜色。
S212,生成包含所有绘制后的字符的目标文本对象,并显示所述目标文本对象。
可以理解的是,采用相同的方式绘制目标文本对象中的所有字符,从而使得目标文本对象与初始文本对象中各字符的字符格式保持一致,并显示该目标文本对象。如图10所示方框中所显示的即为绘制后的目标文本对象。
在本发明实施例中,通过获取初始文本对象,并获取该初始文本对象中的当前行文本对象,基于当前行文本对象中所有字符的第一总宽度与文本显示行宽的第一差值对当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象,并依次对齐调整其它行文本对象,在对所有行文本对象调整完成后,生成包含所有调整后的行文本对象的目标文本对象,并显示目标文本对象。通过将初始文本对象分割为至少一个行文本对象后,分别对每个行文本对象进行对齐调整,从而使得最终显示的文本对象行尾整齐,同时,当行首存在设定字符时,通过移动行首字符而对齐行首,并在有不同字符类型的相邻两字符间插入空格区分显示字符,使得文本显示效果更加美观。
下面将结合附图11-附图15,对本发明实施例提供的文本显示设备进行详细介绍。需要说明的是,附图11-附图15所示的设备,用于执行本发明图1-图14所示实施例的方法,为了便于说明,仅示出了与本发明实施例相关的部分,具体技术细节未揭示的,请参照本发明图1-图10所示的实施例。
请参见图11,为本发明实施例提供了一种文本显示设备的结构示意图。如图11所示,本发明实施例的所述文本显示1可以包括:行文本获取单元11、行文本调整单元12和目标文本显示单元13。
行文本获取单元11,用于获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
可以理解的是,所述初始文本对象是指未采用任何文本组件排版的文本内容。当采用文本组件对初始文本对象进行排版后,可将初始文本对象排列为至少一个行文本对象。所述初始文本对象中包括至少一个字符,所述字符可以包括文字、图片、链接、公式等各类型字符。
所述文本组件是用来显示字符的组件,其实质就是以设定的格式显示一块文本对象的区域。现有技术中常采用TextView组件显示文本对象,TextView可以显示丰富的文本信息,也可以显示图文并茂的混排页面。TextView的常用属性包括setText(),用于设置文本内容,同xml中的android:text;setTextSize(),用于设置文本字体大小,同xml中的android:textSize;setTextColor(),用于设置文本颜色,同xml中的android:textColor;setBackgroundColor(),用于设置背景颜色,同xml中的android:background等。
但TextView在排版上的处理规则是参照Unicode官方的排版标准,对于处理不能截断的数字或英文单词时,会将整串数字或英文换到下一行去显示,并且保证位于行首的字符不能为标点符号,以及对于连接符号(——,……)不能在中间截断,等诸多规则下实现文本对象的排版的,但显示效果不自然,通常文本对象的右侧不能保持对齐。因此,在本发明实施例中采用一种新的文本组件对初始文本对象进行显示。
具体实现中,行文本获取单元11获取所述初始文本对象中所有字符的第二总宽度,当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时(说明第二总宽度与文本显示行宽差距不大),或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值小于所述设定阈值范围的最小值时(说明第二总宽度比文本显示行宽小很多),将所述初始文本对象确定为所述初始文本对象中的当前行文本对象,当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时(说明第二总宽度比文本显示行宽大很多),截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。
其中,可基于所述初始文本对象中的可截断字符所在的位置或者文本显示行宽截断所述初始文本对象。具体为当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
例如,如图2所示为文本截断规则表,其中,oo表示可直接截断,ss表示只能在空格之后截断,cc表示有连接字符才可截断(如在连接字符后截断),xx表示不可截断。“OP、CL、…、EB”则表示字符属性,例如“OP”表示开放标点,如“(”,“[”,“{”等,“CL”表示闭标点符合,如“}”,“)”或“》”等,“CP”表示闭括弧,如“)”,“]”等,“QU”表示引号,“GL”表示不中断,“NS”表示非开始符,如“!!”,“?”,“??”,“!?”等,“EX”表示感叹号“!”或疑问号“?”,“SY”表示允许在前中断的符号“/”,“IS”表示数值分隔符“.”或者“,”等,“PR”表示前缀数字“$,£,¥”等,“PO”表示后缀数字“%,”,“NU”表示数值,“AL”表示字母,“ID”表示文字,“IN”表示不可分割的,如引线,“HY”表示连字符,“BA”表示在之后中断,“BB”表示在之前中断,“B2”表示在之前和之后中断,“ZW”表示零宽度空间,“CM”表示组合标记,“WJ”表示词连词,“H2”表示韩文LV音节,“H3”表示韩文LVT音节,“JL”表示韩文L连接符,“JV”表示韩文V连接符,“JT”表示韩文T连接符,“EB”表示表情符。该表中纵向代表前一个字符,横向代表后一个字符。若初始文本对象为“Welcome to 2018公开课。”,首先将“W”作为前一个字符,“e”作为后一个字符,基于图2可知“W”和“e”之间不可截断,依此方法依次查找该初始文本对象中的所有字符,从而确定该初始文本对象中的可截断字符集合{e、o、8、公、开},若“o”距离文本显示行宽右侧最近,则从“o”后的空格处截断,从而得到行文本对象为“Welcome to”和“2018公开课。”当然,如果“Welcome to 2018公开课。”中没有可截断字符,则基于文本显示行宽(比如2所在的位置)直接强制截断,从而得到行文本对象为“Welcome to 2”和“018公开课。”。
所述获取所述初始文本对象中所有字符的第二总宽度,可以理解为,分别测量所述初始文本对象中每个字符的宽度,并将所测量的宽度相加。对于文字字符,可采用paint.measureText测量宽度,而而对于图片字符或公式字符等非文字字符,可在预存的字符类型集合中获取该字符的宽度。
其中,采用paint.measureText测量字符宽度时具体如下:public static floatGetTextWidth(String text,float Size){//第一个参数是要测量的字符,第二个参数是字体大小}
TextPaint FontPaint=new TextPaint();
FontPaint.setTextSize(Size);
return FontPaint.measureText(text);}
需要说明的是,最终的返回值单位为像素(px,pixel)。
可选的,当所述初始文本对象中的各字符设置了格式时,所述初始文本对象实质上是一个SpannableString,通过getSpan的系统接口就可解析出初始文本对象中包含的格式Spann,并可采用一个List结构体将当前的Spann及对应的字符在初始文本对象中的位置信息存储起来,用于绘制文本时调用。
而所设置的格式则采用setSpan函数进行设置,setSpan(Object what,intstart,int end,int flags)需要输入四个参数,what表示设置的格式类型Spann,可以是前景色、背景色、也可以是可点击的文本等等,start表示需要设置格式的字符的开始位置,同理end表示结束位置以及flags参数,flags参数共有四种属性:Spanned.SPAN_INCLUSIVE_EXCLUSIVE从开始位置到结束位置,包括开始位置;Spanned.SPAN_INCLUSIVE_INCLUSIVE从开始位置到结束位置,同时包括开始位置和结束位置;Spanned.SPAN_EXCLUSIVE_EXCLUSIVE从开始位置到结束位置,但都不包括开始位置和结束位置;Spanned.SPAN_EXCLUSIVE_INCLUSIVE从开始位置到结束位置,包括结束位置。
行文本调整单元12,用于获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
可以理解的是,将初始文本对象分割为多个行文本对象后,获取当前行文本对象,并可采用上述方式测量当前行文本对象中各字符的宽度并相加,以得到当前行文本对象中所有字符的第一总宽度,或者直接基于上述测量结果得到当前行文本对象中所有字符的第一总宽度。
具体实现中,当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,表明当前行文本对象的字符宽度与文本显示行宽差距不大,那么行文本调整单元12基于所述第一差值调整所述当前行文本对象中各字符的宽度,从而使得当前行文本对象与文本组件右对齐;当所述第一差值小于所述设定阈值范围的最小值时,表明当前行文本对象的字符宽度与文本显示行宽的差距较大,那么行文本调整单元12需要采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,缩小当前行文本对象与文本显示行右侧的距离,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。
例如,若文本显示行宽为100像素,设定阈值范围为-5~5像素,第一总宽度为96像素,则将100-96=4个像素的宽度平均分配给当前行文本对象中的各字符,从而使得当前行文本对象与文本显示行宽右对齐。若第一总宽度为90像素,则基于所有行中宽度最小值(如93像素,那么宽度最小值为100-93=7)删除当前行中靠右侧的7个像素的空白空间。
可选的,可以通过直接重写系统文本组件的测量接口(onMeasure)以控制文本组件的实际宽度,并绘制接口(onDraw)以自动调整字间距,简单达到对齐效果。
所述行文本调整单元12,还用于将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
可以理解的是,对于所分割的多个行文本对象,行文本调整单元12采用相同的方式逐行对齐调整,并在调整完当前行文本对象后跳转到下一个行文本对象。
例如,将初始文本对象分割为10个行文本对象A1~A10,若当前的行文本对象为A1,在对A1调整完成后,则跳转到A2,并将A2作为当前行文本对象,且采用与A1相同的方式进行对齐调整,并继续处理A3、A4、…、A10。
目标文本显示单元13,用于当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
可以理解的是,在检测到不存在下一个行文本对象时,表明所有的行文本对象已经调整完成,则目标文本显示单元13生成包含所有调整后的行文本对象的目标文本对象,依次绘制所述目标文本对象中的各字符并进行显示。
例如,当调整完A10后,所有的行文本都已经调整完成,则将调整后的A1~A10对应的文本对象作为目标文本对象进行显示。
优选的,当初始文本对象中的各字符设置了格式时,在绘制目标文本对象中的各字符时,需要获取所述目标文本对象中各字符,在所述字符格式集合中查找当前字符的目标字符格式,采用所述目标字符格式绘制所述当前字符,生成包含所有绘制后的字符的目标文本对象,并显示所述目标文本对象。所述字符格式集合中存储有所述初始文本对象中各字符以及各字符的字符格式。
在本发明实施例中,通过获取初始文本对象,并获取该初始文本对象中的当前行文本对象,基于当前行文本对象中所有字符的第一总宽度与文本显示行宽的第一差值对当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象,并依次对齐调整其它行文本对象,在对所有行文本对象调整完成后,生成包含所有调整后的行文本对象的目标文本对象,并显示目标文本对象。通过将初始文本对象分割为至少一个行文本对象后,分别对每个行文本对象进行对齐调整,从而使得最终显示的文本对象行尾整齐,文本显示效果更加美观。
请参见图12,为本发明实施例提供了一种文本显示设备的结构示意图。如图12所示,本发明实施例的所述文本显示设备1可以包括:行文本获取单元11、行文本调整单元12、目标文本显示单元13、空白插入单元14、字符移动单元15、格式获取单元16和格式保存单元17。
格式获取单元16,用于获取所述初始文本对象中各字符的字符格式;
可以理解的是,所述初始文本对象是指未采用任何文本组件排版的文本内容。当采用文本组件对初始文本对象进行排版后,可将初始文本对象排列为至少一个行文本对象。所述初始文本对象中包括至少一个字符,所述字符可以包括中文、英文、数字、图片、链接、公式等各类型字符。
所述文本组件是用来显示字符的组件,其实质就是以设定的格式显示一块文本对象的区域。现有技术中常采用TextView组件显示文本对象,TextView可以显示丰富的文本信息,也可以显示图文并茂的混排页面。TextView的常用属性包括setText(),用于设置文本内容,同xml中的android:text;setTextSize(),用于设置文本字体大小,同xml中的android:textSize;setTextColor(),用于设置文本颜色,同xml中的android:textColor;setBackgroundColor(),用于设置背景颜色,同xml中的android:background等。
但TextView在排版上的处理规则是参照Unicode官方的排版标准,对于处理不能截断的数字或英文单词时,会将整串数字或英文换到下一行去显示,并且保证位于行首的字符不能为标点符号,以及对于连接符号(—,……)不能在中间截断,等诸多规则下实现文本对象的排版的,但显示效果不自然,通常文本对象的右侧不能保持对齐。因此,在本发明实施例中采用一种新的文本组件对初始文本对象进行显示。
当所述初始文本对象中的各字符设置了格式时,所述初始文本对象实质上是一个SpannableString,通过getSpan的系统接口就可解析出初始文本对象中包含的格式Spann,并可采用一个List结构体将当前的Spann及对应的字符在初始文本对象中的位置信息存储起来,用于绘制文本时调用。
而所设置的格式则采用setSpan函数进行设置,setSpan(Object what,intstart,int end,int flags)需要输入四个参数,what表示设置的格式类型Spann,可以是前景色、背景色、也可以是可点击的文本等等,start表示需要设置格式的字符的开始位置,同理end表示结束位置以及flags参数,flags参数共有四种属性:Spanned.SPAN_INCLUSIVE_EXCLUSIVE从开始位置到结束位置,包括开始位置;Spanned.SPAN_INCLUSIVE_INCLUSIVE从开始位置到结束位置,同时包括开始位置和结束位置;Spanned.SPAN_EXCLUSIVE_EXCLUSIVE从开始位置到结束位置,但都不包括开始位置和结束位置;Spanned.SPAN_EXCLUSIVE_INCLUSIVE从开始位置到结束位置,包括结束位置。
所述字符格式可以包括“ClickSpan、ImageSpan、BackgroundSpan、AbsoluteSizeSpan”等。
具体实现中,格式获取单元16可依次遍历初始文本对象中的各字符,并通过getSpan的系统接口解析出遍历到的当前字符对应的字符格式Spann。
格式保存单元17,用于将所述各字符以及所述各字符的字符格式保存至字符格式集合中;
可以理解为,将字符以及该字符对应的字符格式以映射关系表的形式对应保存至字符格式集合中,如表1所示。其中,所述各字符可以按照在初始文本对象中出现的先后顺序存储,也可以任意顺序存储,但需要在该映射关系表中存储每个字符的位置。
一种优选的实现方式为,基于字符位置(第几个字符)以及字符格式存储,通过getSpan的系统接口解析出初始文本对象中包含了哪些字符格式Spann以及每个字符格式对应的字符位置,然后采用一个List结构体进行存储,如图4所示,其中,0-3字符的字符格式为可点击格式ClickSpan,4-7字符为图片格式ImageSpan,8-12字符为添加了背景色格式BackgroundSpan,13-17字符为设置了字号大小格式AbsoluteSizeSpan。
所述结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。
在编程语言中List是标准类库中的一个类,可以简单视之为双向链表,以线性列的方式管理物件集合。List的特色是在集合的任何位置增加或删除元素都很快,但是不支持随机存取。List是类库提供的众多容器之一,除此之外还有vector、set、map、…等等。List以模板方式实现(即泛型),可以处理任意型态的变量,包括使用者自定义的资料型态,例如:可以是一个放置整数(int)型态的list、也可以是放置字串(char或string)型态的List、或者放置使用者自定类别(user-defined class)的List。在本发明实施例中,采用List存放结构体存储字符格式Spann以及每个字符格式对应的字符位置。
可选的,所述字符格式集合中还可存储图片、公式等非文字字符的宽度,以便在获取初始文本对象中各字符宽度时,直接调用所存储的非文字字符的宽度。
行文本获取单元11,用于获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
可选的,如图13所示,所述行文本获取单元11,包括:
第二总宽度获取子单元111,用于获取所述初始文本对象中所有字符的第二总宽度;
所述获取所述初始文本对象中所有字符的第二总宽度,可以理解为,分别测量所述初始文本对象中每个字符的宽度,并将所测量的宽度相加,将相加所得结果作为第二总宽度。对于文字字符,可采用paint.measureText测量宽度,而对于图片字符或公式字符等非文字字符,可在预存的字符格式集合中获取该字符的宽度。
其中,采用paint.measureText测量字符宽度时具体如下:public static floatGetTextWidth(String text,float Size){//第一个参数是要测量的字符,第二个参数是字体大小}
TextPaint FontPaint=new TextPaint();
FontPaint.setTextSize(Size);
return FontPaint.measureText(text);}
需要说明的是,最终的返回值单位为像素(px,pixel)。
行文本获取子单元112,用于基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象。
可以理解的是,通过计算第二总宽度与文本显示行宽的差值,并比较该差值与设定阈值范围的大小,并依据比较结果确定所述初始文本对象中的当前行文本对象。
进一步的,所述行文本获取子单元112,具体用于:
当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本行宽的第二差值小于所述设定阈值范围的最小值时,将所述初始文本对象确定为所述初始文本对象中的当前行文本对象;
可以理解的是,当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,表明初始文本对象的字符宽度与文本显示行宽差距不大;当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值小于所述设定阈值范围的最小值时,表明初始文本对象的字符宽度小于文本显示行宽,那么通过一行可以显示完初始文本对象的所有字符,此时所述初始文本对象即为所述初始文本对象中的当前行文本对象。
例如,文本显示行宽为100像素,设定阈值范围为-5~5像素,若第二总宽度为96像素,此时,100-96=4属于-5~5像素范围内,那么初始文本对象可通过一行进行显示,则该初始文本对象即为当前行文本对象;若第二总宽度为80像素,此时,100-80=20<100-5=95,则该初始文本对象即为当前行文本对象。
当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。
可以理解的是,当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,表明初始文本对象的字符宽度大于文本显示行宽,需要通过多行才可以显示完初始文本对象的所有字符,此时需要将初始文本对象截断为多个行文本对象,并将当前所选取的行文本对象确定为当前行文本对象。
若第二总宽度为350像素,则需要多行显示初始文本对象,因此可将该初始文本对象截断为多行文本对象,并将多行文本对象中当前对齐调整的行文本对象确定为当前行文本对象。
进一步的,所述行文本获取子单元112,具体用于:
当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;
例如,如图2所示为文本截断规则表,其中,oo表示可直接截断,ss表示只能在空格之后截断,cc表示有连接字符才可截断(如在连接字符后截断),xx表示不可截断。“OP、CL、…、EB”则表示字符属性,例如“OP”表示开放标点,如“(”,“[”,“{”等,“CL”表示闭标点符合,如“}”,“)”或“》”等,“CP”表示闭括弧,如“)”,“]”等,“QU”表示引号,“GL”表示不中断,“NS”表示非开始符,如“!!”,“?”,“??”,“!?”等,“EX”表示感叹号“!”或疑问号“?”,“SY”表示允许在前中断的符号“/”,“IS”表示数值分隔符“.”或者“,”等,“PR”表示前缀数字“$,£,¥”等,“PO”表示后缀数字“%,”,“NU”表示数值,“AL”表示字母,“ID”表示文字,“IN”表示不可分割的,如引线,“HY”表示连字符,“BA”表示在之后中断,“BB”表示在之前中断,“B2”表示在之前和之后中断,“ZW”表示零宽度空间,“CM”表示组合标记,“WJ”表示词连词,“H2”表示韩文LV音节,“H3”表示韩文LVT音节,“JL”表示韩文L连接符,“JV”表示韩文V连接符,“JT”表示韩文T连接符,“EB”表示表情符。该表中纵向代表前一个字符,横向代表后一个字符。若初始文本对象为“Welcome to 2018公开课。”,首先将“W”作为前一个字符,“e”作为后一个字符,基于图2可知“W”和“e”之间不可截断,依此方法依次查找该初始文本对象中的所有字符,从而确定该初始文本对象中的可截断字符集合{e、o、8、公、开},若“o”距离文本显示行宽右侧最近,则从“o”后的空格处截断,从而得到行文本对象为“Welcome to”和“2018公开课。”需要说明的是,若“2018公开课。”通过一行不能显示完整,则需要采用上述相同的方法截断“2018公开课。”,从而再分割为两个行文本对象。选取截断后的文本对象中的任意一行或者第一行作为当前行文本对象。
当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
如果“Welcome to 2018公开课。”中没有可截断字符,则基于文本显示行宽(比如2所在的位置)直接强制截断,从而得到行文本对象为“Welcome to 2”和“018公开课。”,选取截断后的文本对象中的任意一行或者第一行作为当前行文本对象。
行文本调整单元12,用于获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
可以理解的是,所述对齐调整是指将当前行文本对象与文本显示行的右侧对齐。
具体实现中,当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,基于所述第一差值调整所述当前行文本对象中各字符的宽度,以生成对齐调整后的行文本对象;当所述第一差值小于所述设定阈值范围的最小值时,采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,以生成对齐调整后的行文本对象,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。所述空白宽度是指每个行文本对象的右侧距离文本显示行右侧的宽度。
可选的,所述行文本调整单元12,具体用于:
当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,基于所述第一差值调整所述当前行文本对象中各字符的宽度;
若文本显示行宽为100像素,设定阈值范围为-5~5像素,第一总宽度为96像素,则将100-96=4个像素的宽度平均分配给当前行文本对象中的各字符,从而使得当前行文本对象与文本显示行右对齐。例如,若将初始文本对象截断后得到的多个行文本对象,并基于每个行文本对象的字符总宽度与文本显示行宽的差值对每个行文本对象中各字符的宽度进行压缩或者扩宽,从而得到对齐后的文本对象,如图7所示。
当所述第一差值小于所述设定阈值范围的最小值时,采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。
若第一总宽度为90像素,则基于所有行中宽度最小值(如93像素,那么宽度最小值为100-93=7)删除当前行中靠右侧的7个像素的空白空间。例如,如图8a所示,将初始文本对象截断为两个行文本对象,第一行的空白宽度(图中方框所示)小于第二行的空白宽度,则删除第一行的空白宽度指示的空白空间,从而得到图8b所示的排版结果。
空白插入单元14,用于当检测到所述当前行文本对象中相邻两字符为第一字符与第二字符时,在所述相邻两字符之间插入设定宽度的空白空间,所述第一字符的字符类型与所述第二字符的字符类型不同。
例如,所述第一字符为中文,第二字符为英文(你好hello蔡先生),或者第一字符为中文,第二字符为数字(你好1662编号),则需要在第一字符与第二字符之间插入空格,从而使得第一字符与第二字符的区分更明显。
具体实现中,依次遍历当前行文本对象中的各个字符,检测是否存在相邻两字符为不同的字符类型,若存在,则在该两个字符之间插入设定宽度(如1个英文字符宽度)的空格。
字符移动单元15,用于当检测到所述当前行文本对象中存在第一个字符或/和最后一个字符为设定类型的字符时,删除所述当前行文本对象中所述第一个字符或/和最后一个字符中的空格宽度,并移动所述第一个字符或/和最后一个字符。
可以理解的是,所述设定类型的字符包括书名号、引号、括号等半封闭符号。
具体实现中,字符移动单元15获取当前行中的一个字符或/和最后一个字符,并将获取到的字符与设定类型字符集合进行匹配,若存在匹配一致的字符,则将第一个字符的空格并将第一个字符左移或/和删除最后一个字符中的空格宽度并将最后一个字符右移,从而将当前行文本对象与文本显示行左对齐或/和右对齐。
例如,如图9所示,在第二个行文本对象中的第一个字符为“《”,则将该“《”移动到行顶,从而使该行的起始位置与文本显示行的左边距对齐。
可选的,对于初始文本对象中所包含的小语种(如阿拉伯文,泰文等),由于字形之间的关联性,有可能由于前一个字符不一样而导致下一个字符虽然一致,但是最终绘制出来的字形是不一样的,因此不需要调整小语种字符的字符宽度。其中,小语种可采用正则表达式进行识别。所述正则表达式是对字符串(包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
所述行文本调整单元12,还用于将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
可以理解的是,对于所分割的多个行文本对象,采用相同的方式逐行对齐调整,并在调整完当前行文本对象后跳转到下一个行文本对象。
目标文本显示单元13,用于当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
可以理解的是,在检测到不存在下一个行文本对象时,表明所有的行文本对象已经调整完成,则生成包含所有调整后的行文本对象的目标文本对象。
可选的,如图14所示,所述目标文本显示单元13,包括:
类型查找子单元131,用于获取所述目标文本对象中各字符,在所述字符格式集合中查找当前字符的目标字符格式;
具体实现中,类型查找子单元131读取目标文本对象中的字符,并依次遍历字符格式集合中的各个字符,当所读取的字符与在字符格式集合中遍历到的字符一致时,将该字符对应的字符格式确定为所读取到的字符的目标字符格式。其中,在遍历时,需要基于字符的位置,也就是说,若在字符格式集合中存在多个与读取到的字符一致的字符时,若直接将当前遍历到的字符对应的字符格式确定为目标字符格式,则有可能会发生错误,还需要考虑字符的位置以唯一准确确定当前读取到的字符的目标字符格式。
例如,对于“welcome”,若当前读取到的是m后的“e”,而在字符格式集合中所存储的w后的“e”的字符格式为ClickSpan,m后的“e”的字符格式为BackgroundSpan,若当前遍历到的是w后的“e”,而将ClickSpan作为目标字符格式则是错误的,因此,还需要考虑字符的位置,字符位置为7,则可以唯一确定当前读取到的字符的目标字符格式。
字符绘制子单元132,用于采用所述目标字符格式绘制所述当前字符;
也就是说,将所确定的目标字符格式添加到当前字符上。例如,若确定的目标字符格式为BackgroundSpan,则在当前字符上添加背景色。进一步的,在所述字符格式中还可携带背景颜色。
文本显示子单元133,用于生成包含所有绘制后的字符的目标文本对象,并显示所述目标文本对象。
可以理解的是,采用相同的方式绘制目标文本对象中的所有字符,从而使得目标文本对象与初始文本对象中各字符的字符格式保持一致,并显示该目标文本对象。如图10所示方框中所显示的即为绘制后的目标文本对象。
在本发明实施例中,通过获取初始文本对象,并获取该初始文本对象中的当前行文本对象,基于当前行文本对象中所有字符的第一总宽度与文本显示行宽的第一差值对当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象,并依次对齐调整其它行文本对象,在对所有行文本对象调整完成后,生成包含所有调整后的行文本对象的目标文本对象,并显示目标文本对象。通过将初始文本对象分割为至少一个行文本对象后,分别对每个行文本对象进行对齐调整,从而使得最终显示的文本对象行尾整齐,同时,当行首存在设定字符时,通过移动行首字符而对齐行首,并在有不同字符类型的相邻两字符间插入空格区分显示字符,使得文本显示效果更加美观。
本发明实施例还提供了一种计算机存储介质,所述计算机存储介质可以存储有多条指令,所述指令适于由处理器加载并执行如上述图1-图10所示实施例的方法步骤,具体执行过程可以参见图1-图10所示实施例的具体说明,在此不进行赘述。
请参见图15,为本发明实施例提供了一种电子设备的结构示意图。如图15所示,所述电子设备1000可以包括:至少一个处理器1001,例如CPU,至少一个网络接口1004,用户接口1003,存储器1005,至少一个通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。其中,用户接口1003可以包括显示屏(Display)、摄像头(Camera),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。存储器1005可选的还可以是至少一个位于远离前述处理器1001的存储装置。如图15所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及文本显示应用程序。
在图15所示的电子设备1000中,用户接口1003主要用于为用户提供输入的接口,获取用户输入的数据;而处理器1001可以用于调用存储器1005中存储的文本显示应用程序,并具体执行以下操作:
获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
在一个实施例中,所述处理器1001在执行获取所述初始文本对象中的当前行文本对象时,具体执行以下操作:
获取所述初始文本对象中所有字符的第二总宽度;
基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象。
在一个实施例中,所述处理器1001在执行基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象时,具体执行以下操作:
当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本行宽的第二差值小于所述设定阈值范围的最小值时,将所述初始文本对象确定为所述初始文本对象中的当前行文本对象;
当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。
在一个实施例中,所述处理器1001在执行截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象时,具体执行以下操作:
当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;
当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
在一个实施例中,所述处理器1001在执行基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行调整时,具体执行以下操作:
当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,基于所述第一差值调整所述当前行文本对象中各字符的宽度;
当所述第一差值小于所述设定阈值范围的最小值时,采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。
在一个实施例中,所述处理器1001在执行基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象之后,还执行以下操作:
当检测到所述当前行文本对象中相邻两字符为第一字符与第二字符时,在所述相邻两字符之间插入设定宽度的空白空间,所述第一字符的字符类型与所述第二字符的字符类型不同。
在一个实施例中,所述处理器1001在执行基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象之后,还执行以下操作:
当检测到所述当前行文本对象中存在第一个字符或/和最后一个字符为设定类型的字符时,删除所述当前行文本对象中所述第一个字符或/和最后一个字符中的空格宽度,并移动所述第一个字符或/和最后一个字符。
在一个实施例中,所述处理器1001还执行以下操作:
获取所述初始文本对象中各字符的字符格式;
将所述各字符以及所述各字符的字符格式保存至字符类型集合中。
在一个实施例中,所述处理器1001在执行显示所述目标文本对象时,具体执行以下操作:
获取所述目标文本对象中各字符,在所述字符格式集合中查找当前字符的目标字符格式;
采用所述目标字符格式绘制所述当前字符;
生成包含所有绘制后的字符的目标文本对象,并显示所述目标文本对象。
在本发明实施例中,通过获取初始文本对象,并获取该初始文本对象中的当前行文本对象,基于当前行文本对象中所有字符的第一总宽度与文本显示行宽的第一差值对当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象,并依次对齐调整其它行文本对象,在对所有行文本对象调整完成后,生成包含所有调整后的行文本对象的目标文本对象,并显示目标文本对象。通过将初始文本对象分割为至少一个行文本对象后,分别对每个行文本对象进行对齐调整,从而使得最终显示的文本对象行尾整齐,同时,当行首存在设定字符时,通过移动行首字符而对齐行首,并在有不同字符类型的相邻两字符间插入空格区分显示字符,使得文本显示效果更加美观。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
Claims (15)
1.一种文本显示方法,其特征在于,包括:
获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
2.根据权利要求1所述的方法,其特征在于,所述获取所述初始文本对象中的当前行文本对象,包括:
获取所述初始文本对象中所有字符的第二总宽度;
基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象。
3.根据权利要求2所述的方法,其特征在于,所述基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象,包括:
当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值小于所述设定阈值范围的最小值时,将所述初始文本对象确定为所述初始文本对象中的当前行文本对象;
当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。
4.根据权利要求3所述的方法,其特征在于,所述截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象,包括:
当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;
当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
5.根据权利要求4所述的方法,其特征在于,所述基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,包括:
当所述第一总宽度与所述文本显示行宽的第一差值在所述设定阈值范围内时,基于所述第一差值调整所述当前行文本对象中各字符的宽度;
当所述第一差值小于所述设定阈值范围的最小值时,采用空白宽度集合中空白宽度最小值删除所述当前行文本对象中的空白空间,所述空白宽度集合包括所有行文本对象分别对应的空白宽度。
6.根据权利要求1所述的方法,其特征在于,所述基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象之后,还包括:
当检测到所述当前行文本对象中相邻两字符为第一字符与第二字符时,在所述相邻两字符之间插入设定宽度的空白空间,所述第一字符的字符类型与所述第二字符的字符类型不同。
7.根据权利要求1所述的方法,其特征在于,所述基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象之后,还包括:
当检测到所述当前行文本对象中存在第一个字符或/和最后一个字符为设定类型的字符时,删除所述当前行文本对象中所述第一个字符或/和最后一个字符中的空格宽度,并移动所述第一个字符或/和最后一个字符。
8.根据权利要求1所述的方法,其特征在于,还包括:
获取所述初始文本对象中各字符的字符格式;
将所述各字符以及所述各字符的字符格式保存至字符格式集合中。
9.根据权利要求8所述的方法,其特征在于,所述显示所述目标文本对象,包括:
获取所述目标文本对象中各字符,在所述字符格式集合中查找当前字符的目标字符格式;
采用所述目标字符格式绘制所述当前字符;
生成包含所有绘制后的字符的目标文本对象,并显示所述目标文本对象。
10.一种文本显示设备,其特征在于,包括:
行文本获取单元,用于获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
行文本调整单元,用于获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
所述行文本调整单元,还用于将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
目标文本显示单元,用于当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
11.根据权利要求10所述的设备,其特征在于,所述行文本获取单元,包括:
第二总宽度获取子单元,用于获取所述初始文本对象中所有字符的第二总宽度;
行文本获取子单元,用于基于所述第二总宽度、文本显示行宽以及设定阈值范围,获取所述初始文本对象中的当前行文本对象。
12.根据权利要求11所述的设备,其特征在于,所述行文本获取子单元,具体用于:
当所述第二总宽度与文本显示行宽的第二差值在设定阈值范围内时,或当所述第二总宽度小于所述文本显示行宽,且所述第二总宽度与所述文本行宽的第二差值小于所述设定阈值范围的最小值时,将所述初始文本对象确定为所述初始文本对象中的当前行文本对象;
当所述第二总宽度大于所述文本显示行宽,且所述第二总宽度与所述文本显示行宽的第二差值大于所述设定阈值范围的最大值时,截断所述初始文本对象,以获取所述初始文本对象中的当前行文本对象。
13.根据权利要求12所述的设备,其特征在于,所述行文本获取子单元,具体用于:
当在所述初始文本对象中存在可截断字符集合时,在所述可截断字符集合中获取距离所述文本显示行宽指示的目标位置最近的可截断字符,基于所述可截断字符指示的可截断位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象;
当在所述文本对象中不存在可截断字符集合时,获取所述初始文本对象中所述文本显示行宽指示的目标位置,基于所述目标位置截断所述初始文本对象,以获取所有行文本对象,并在所述所有行文本对象中获取当前行文本对象。
14.一种计算机存储介质,其特征在于,所述计算机存储介质存储有多条指令,所述指令适于由处理器加载并执行如权利要求1~9任意一项的方法步骤。
15.一种电子设备,其特征在于,包括:处理器和存储器;其中,所述存储器存储有计算机程序,所述计算机程序适于由所述处理器加载并执行以下步骤:
获取初始文本对象,并获取所述初始文本对象中的当前行文本对象;
获取所述当前行文本对象中所有字符的第一总宽度,基于所述第一总宽度与文本显示行宽的第一差值对所述当前行文本对象的显示格式进行对齐调整,以生成对齐调整后的行文本对象;
将所述当前行文本对象的下一个行文本对象确定为当前行文本对象,并转入执行获取所述当前行文本对象中所有字符的第一总宽度的步骤;
当检测到不存在下一个行文本对象时,生成包含所有调整后的行文本对象的目标文本对象,并显示所述目标文本对象。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810457722.8A CN108710601B (zh) | 2018-05-14 | 2018-05-14 | 一种文本显示方法及其设备、存储介质、电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810457722.8A CN108710601B (zh) | 2018-05-14 | 2018-05-14 | 一种文本显示方法及其设备、存储介质、电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108710601A true CN108710601A (zh) | 2018-10-26 |
CN108710601B CN108710601B (zh) | 2022-04-01 |
Family
ID=63869037
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810457722.8A Active CN108710601B (zh) | 2018-05-14 | 2018-05-14 | 一种文本显示方法及其设备、存储介质、电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108710601B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109739595A (zh) * | 2018-12-18 | 2019-05-10 | 北京字节跳动网络技术有限公司 | 基于web交互的tip显示内容处理方法、装置及电子设备 |
CN109977130A (zh) * | 2019-03-29 | 2019-07-05 | 珠海豹好玩科技有限公司 | 一种热词展示方法及系统 |
CN110968988A (zh) * | 2019-12-06 | 2020-04-07 | 歌尔科技有限公司 | 显示处理方法、装置、电子设备及可读存储介质 |
CN111126011A (zh) * | 2019-12-25 | 2020-05-08 | 中消云(北京)物联网科技研究院有限公司 | 文本的右对齐的处理方法、装置、存储介质和处理器 |
CN111144063A (zh) * | 2019-12-25 | 2020-05-12 | 中消云(北京)物联网科技研究院有限公司 | 文本的两端对齐的处理方法、装置、存储介质和处理器 |
CN111400998A (zh) * | 2020-03-09 | 2020-07-10 | 北京字节跳动网络技术有限公司 | 一种文本的显示方法、装置、电子设备及可读存储介质 |
CN112102442A (zh) * | 2020-09-04 | 2020-12-18 | 卡莱特(深圳)云科技有限公司 | 一种led显示屏图文行走设置方法及装置 |
CN112445551A (zh) * | 2019-08-27 | 2021-03-05 | 成都鼎桥通信技术有限公司 | 一种解决Textview控件自动换行问题的方法和装置 |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1949210A (zh) * | 2006-11-03 | 2007-04-18 | 上海中标软件有限公司 | 计算机文档中实现藏文自动规则排版的方法 |
US20100107061A1 (en) * | 2008-10-27 | 2010-04-29 | Yahoo! Inc. | Method and apparatus for estimating the size of rendered text |
CN102147790A (zh) * | 2011-04-15 | 2011-08-10 | 华为软件技术有限公司 | 文本排版方法及排版引擎 |
CN102902678A (zh) * | 2011-07-26 | 2013-01-30 | 腾讯科技(深圳)有限公司 | 文本内容排版方法和终端 |
CN103106406A (zh) * | 2011-11-09 | 2013-05-15 | 佳能株式会社 | 用于切分具有不同字符宽度的文本行中的字符的方法和系统 |
CN104133811A (zh) * | 2013-05-02 | 2014-11-05 | 腾讯科技(深圳)有限公司 | 文本处理方法及移动终端 |
CN104731445A (zh) * | 2013-12-24 | 2015-06-24 | 惠州市德赛西威汽车电子有限公司 | 一种长文本显示方法 |
CN105893342A (zh) * | 2015-12-29 | 2016-08-24 | 乐视移动智能信息技术(北京)有限公司 | 一种文本信息处理方法及装置 |
US20160357710A1 (en) * | 2015-06-05 | 2016-12-08 | Alpine Electronics, Inc. | Text display control apparatus and method for controlling text to be displayed |
CN106445904A (zh) * | 2016-09-30 | 2017-02-22 | 乐视控股(北京)有限公司 | 一种页面排版方法及装置 |
CN107391105A (zh) * | 2017-06-07 | 2017-11-24 | 北京五八信息技术有限公司 | 文本绘制方法和装置 |
CN107730511A (zh) * | 2017-09-20 | 2018-02-23 | 北京工业大学 | 一种基于基线估计的藏文历史文献文本行切分方法 |
-
2018
- 2018-05-14 CN CN201810457722.8A patent/CN108710601B/zh active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1949210A (zh) * | 2006-11-03 | 2007-04-18 | 上海中标软件有限公司 | 计算机文档中实现藏文自动规则排版的方法 |
US20100107061A1 (en) * | 2008-10-27 | 2010-04-29 | Yahoo! Inc. | Method and apparatus for estimating the size of rendered text |
CN102147790A (zh) * | 2011-04-15 | 2011-08-10 | 华为软件技术有限公司 | 文本排版方法及排版引擎 |
CN102902678A (zh) * | 2011-07-26 | 2013-01-30 | 腾讯科技(深圳)有限公司 | 文本内容排版方法和终端 |
CN103106406A (zh) * | 2011-11-09 | 2013-05-15 | 佳能株式会社 | 用于切分具有不同字符宽度的文本行中的字符的方法和系统 |
CN104133811A (zh) * | 2013-05-02 | 2014-11-05 | 腾讯科技(深圳)有限公司 | 文本处理方法及移动终端 |
CN104731445A (zh) * | 2013-12-24 | 2015-06-24 | 惠州市德赛西威汽车电子有限公司 | 一种长文本显示方法 |
US20160357710A1 (en) * | 2015-06-05 | 2016-12-08 | Alpine Electronics, Inc. | Text display control apparatus and method for controlling text to be displayed |
CN105893342A (zh) * | 2015-12-29 | 2016-08-24 | 乐视移动智能信息技术(北京)有限公司 | 一种文本信息处理方法及装置 |
CN106445904A (zh) * | 2016-09-30 | 2017-02-22 | 乐视控股(北京)有限公司 | 一种页面排版方法及装置 |
CN107391105A (zh) * | 2017-06-07 | 2017-11-24 | 北京五八信息技术有限公司 | 文本绘制方法和装置 |
CN107730511A (zh) * | 2017-09-20 | 2018-02-23 | 北京工业大学 | 一种基于基线估计的藏文历史文献文本行切分方法 |
Non-Patent Citations (2)
Title |
---|
朱明东: "一种扩展的Android文本显示控件实现", 《软件导刊》 * |
杨帆等: "不等宽字体的折行显示算法", 《硅谷》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109739595A (zh) * | 2018-12-18 | 2019-05-10 | 北京字节跳动网络技术有限公司 | 基于web交互的tip显示内容处理方法、装置及电子设备 |
CN109977130A (zh) * | 2019-03-29 | 2019-07-05 | 珠海豹好玩科技有限公司 | 一种热词展示方法及系统 |
CN112445551A (zh) * | 2019-08-27 | 2021-03-05 | 成都鼎桥通信技术有限公司 | 一种解决Textview控件自动换行问题的方法和装置 |
CN110968988A (zh) * | 2019-12-06 | 2020-04-07 | 歌尔科技有限公司 | 显示处理方法、装置、电子设备及可读存储介质 |
CN111126011A (zh) * | 2019-12-25 | 2020-05-08 | 中消云(北京)物联网科技研究院有限公司 | 文本的右对齐的处理方法、装置、存储介质和处理器 |
CN111144063A (zh) * | 2019-12-25 | 2020-05-12 | 中消云(北京)物联网科技研究院有限公司 | 文本的两端对齐的处理方法、装置、存储介质和处理器 |
CN111400998A (zh) * | 2020-03-09 | 2020-07-10 | 北京字节跳动网络技术有限公司 | 一种文本的显示方法、装置、电子设备及可读存储介质 |
CN111400998B (zh) * | 2020-03-09 | 2023-09-26 | 北京字节跳动网络技术有限公司 | 一种文本的显示方法、装置、电子设备及可读存储介质 |
CN112102442A (zh) * | 2020-09-04 | 2020-12-18 | 卡莱特(深圳)云科技有限公司 | 一种led显示屏图文行走设置方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN108710601B (zh) | 2022-04-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108710601A (zh) | 一种文本显示方法及其设备、存储介质、电子设备 | |
CN1495640B (zh) | 存储在单个xml文件中的可被理解xml的应用程序处理的文字处理器文档 | |
JP3425408B2 (ja) | 文書読取装置 | |
US20180052808A1 (en) | Creation and display of a webpage with alternative layouts for different webpage widths | |
CN108108194B (zh) | 用户界面编辑方法以及用户界面编辑器 | |
KR20150128921A (ko) | 고정 서식 문서에서의 동아시아 레이아웃 특징들의 검출 및 재구성 | |
CN104915186B (zh) | 一种制作页面的方法和装置 | |
US6678688B1 (en) | Method and apparatus for composite font generation | |
WO2005088470A2 (en) | Systems and methods for identifying complex text in a presentation data stream | |
US20170132484A1 (en) | Two Step Mathematical Expression Search | |
CN110162773A (zh) | 标题推断器 | |
CN109740124A (zh) | 文档比较的差异输出方法、装置、存储介质及电子设备 | |
US9049400B2 (en) | Image processing apparatus, and image processing method and program | |
CN107438194A (zh) | 一种智能电视ui对象绘制方法及智能电视 | |
CN105512096B (zh) | 一种基于文档中内嵌字体的优化方法及装置 | |
JP4612669B2 (ja) | 漫画作成支援装置、およびプログラム | |
US20060188162A1 (en) | Common interface for ink trees | |
US10031894B2 (en) | Method and apparatus of building intermediate character library | |
WO2018139700A1 (ko) | 외곽선 폰트를 이용하여 metafont에 의한 폰트를 생성하는 장치 및 방법 | |
JP6803597B1 (ja) | ロゴデザイン作成システム、ロゴデザイン作成方法、およびロゴデザイン作成プログラム | |
CN101464782B (zh) | 版面描述信息的转换方法及应用版面描述的装置 | |
CN106598934A (zh) | 电子书数据的显示方法、装置及终端设备 | |
JPS60222270A (ja) | 表デ−タ差込み印刷装置 | |
CN106776489B (zh) | 显示设备的电子文档显示方法和系统 | |
CN107241100B (zh) | 字库部件压缩方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |