cocos2d-android-1文本字符串的换行

本文探讨了cocos2d-android中使用CCLabel进行文本自动换行时遇到的问题,包括中文不支持、高度调整限制及换行符的特殊处理。通过分析源码逻辑,解释了英文与中文换行的不同处理方式,并提供了中文字符串自动换行的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天看完CCLabel里面文本根据dimension的自动换行功能,刚开始觉得很多部分都是坑,槽点太多,今天再回顾看一遍,发现虽然问题还是有,但有几个部分总算明白为什么是那么个写法了~

致歉……

通过 CCLabel.makeLabel 静态方法得到一个实体,之后可以传入一个dimension (CGSize 类型) 参数来指定文本绘制的大小。

槽点继续:

槽点1:假如你要显示的是中文,so sorry. 这个方法不适合你。

槽点2:cocos2d-x 可以通过传入(XXX,0) 来指定自动调整Label的高度。但你就不能这样~

槽点3:假如你不知道怎么强制换行,试试将'\n'换成' '(空格),不保证有用哈。至于原因,请看下面逻辑


逻辑整理:

原(针对英文的自动换行):将字符串根据' '切割成N个单词,再遍历所有单词逐个进行拼接。如果这个单词接上去之后该行的宽度不超过dimension的宽度,那么这个单词就接上去,否则这个单词另起一行。  也就是说,这个自动换行功能没有像遇到\n就强制换行的功能(除非你自己再去实现下)。


改(针对中文的自动换行):将字符串根据\n切割成N行,再遍历每一行,如果该行宽度超过dimension的宽度,则保留不大于dimension宽度的字符串,剩余字符串另起一行。

传送门:引自cocos2d的获取字符串长度和高度的计算方法


特别奉送(中文字符串自动换行):

protected ArrayList<String> wrapText(Paint textPaint, String text, float width) {

		/*
		 * the role is: 
		 * 1.Split lines by '\n'.
		 * 2.Add a new line if length of word is larger than width.
		 * 
		 * *** note:This method is useful for Chinese, but not for English.
		 */
		ArrayList<String> lines = new ArrayList<String>();
		String[] words = text.split("\n");

		for (String word : words) {
			float wordWidth = textPaint.measureText(word);
			
			if (wordWidth < width) {
				lines.add(word);
			} else {
				int i = word.length() - 1;
				for (; i >= 0; i--) {
					wordWidth = textPaint.measureText(word, 0, i);
					if (wordWidth < width) {
						break;
					}
				}
				if (i > 0) {
					lines.add(word.substring(0, i));
					lines.add(word.substring(i, word.length()));
				} else {
					lines.add(word);
				}
			}
		}

		return lines;

	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值