更改文字换行风格 ( cocos2dx change line )

  次阅读 作者:智能小宝 来源:互联网 2015-09-27 15:32 我要评论(0)

Cocos2dx change line

在 cocos2dx change line 的实现中,我们可以简单的使用 dimensions属性控制换行。使用它只需将对应的参数值传入构造函数,或者调用 setDimensions 函数即可。

它的换行策略是:当一个单词超出限制长度时,将它移动到下一行。有时这种策略并不合适。例如,在某些语言中,单词都比较长。如果采用这种策略,会出现每一行中只有一个单词。因此需要更改换行策略。当超出限制长度时,使用 - 作为一个分隔单词的标志。

换行策略调用

通过查看Cocos2d-x中换行的实现方式,我发现换行策略是区分平台编程出来的代码。也就是说,为了更改换行策略,我需要分别编写 IOS 和 Java 两部分代码。因为我的目标平台是 Android 平台,因此我只对Java文件进行了更改。IOS 平台的换行策略调用的是系统函数,有兴趣研究的读者可以跟踪源码更改。入口函数为:

12345678910111213141516171819202122232425262728293031323334353637

bool CCTexture2D::initWithString(const char *text, ccFontDefinition *textDefinition){ ...... CCImage* pImage = new CCImage(); do { CC_BREAK_IF(NULL == pImage); bRet = pImage->initWithStringShadowStroke(text, (int)textDefinition->m_dimensions.width, (int)textDefinition->m_dimensions.height, eAlign, textDefinition->m_fontName.c_str(), textDefinition->m_fontSize, textDefinition->m_fontFillColor.r / 255, textDefinition->m_fontFillColor.g / 255, textDefinition->m_fontFillColor.b / 255, shadowEnabled, shadowDX, shadowDY, shadowOpacity, shadowBlur, strokeEnabled, strokeColorR, strokeColorG, strokeColorB, strokeSize); CC_BREAK_IF(!bRet); bRet = initWithImage(pImage); } while (0); ......}

更改Java实现

Android 平台对应的 Java 文件位于 $(2DX-Root)/cocos2dx/platform/android/java/src/org/cocos2dx/lib 文件夹中,文件名是 Cocos2dxBitmap.java

首先,我增加了 divideStringWithMaxWidthByFlag 函数,将它作为另一个换行策略的实现函数。

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788

// add by fansy for — style words private static LinkedList divideStringWithMaxWidthByFlag( final String pString, final int pMaxWidth, final Paint pPaint) { final int charLength = pString.length(); int start = 0; int tempWidth = 0; LinkedList strList = new LinkedList(); if( !isChinese(pString) ) { /* Break a String into String[] by the width & should wrap the word. */ for (int i = 1; i < charLength-1; ++i) { tempWidth = (int) FloatMath.ceil(pPaint.measureText(pString, start,i+1)); if (tempWidth >= pMaxWidth) { if(pString.charAt(i) == ' ') //end with { //change line at i strList.add(pString.substring(start, i)); i = i + 1; // skip space } else if(i>1 && pString.charAt(i-2) == ' ') //only one - left after change line { //change line at i-2 strList.add(pString.substring(start, i-2)); i = i -2; // skip space } else if(i>0 && pString.charAt(i-1) == ' ') //only one - left after change line { //change line at i-1 strList.add(pString.substring(start, i-1)); i = i -1; // skip space } else if(i>0) //replace - at i-2 { //split at i-1 add - at tail change line at i-1 strList.add(pString.substring(start, i-1)+-); i--; } /* Remove spaces at the beginning of a new line. */ while (pString.charAt(i) == ' ') { ++i; } start = i; } } /* Add the last chars. */ if (start < charLength) { strList.add(pString.substring(start)); } } else { strList = divideStringWithMaxWidth(pString, pMaxWidth, pPaint); } return strList; } // 根据Unicode编码完美的判断中文汉字和符号 private static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) { return true; } return false; } // 完整的判断中文汉字和符号 public static boolean isChinese(String strName) { char[] ch = strName.toCharArray(); for (int i = 0; i < ch.length; i++) { char c = ch[i]; if (isChinese(c)) { return true; } } return false; } //end add by fansy

增加函数之后,修改在 splitString 中的调用:

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...