一、setContentSize与setDimensions对于Label的作用

1、首先看看setContentSize的定义:

/*
* Set the untransformed size of the node.
* 设置节点转换前的大小
* The contentSize remiains the same no matter the node is scaled or rotated.
* 无论缩放还是旋转节点,它的contentSize始终保持不变
* All nodes has a size. Layer and Scene has the same size of the screen.
* 所有的节点都有一个大小,layer和scene的大小和屏幕大小保持一致
*//*
* 说明:
* 1、节点在使用的过程中可能进行缩放、旋转等变化,这样导致我们看见的节点的大小可能发生了变化。但是
* contentSize是一直保持
* 不变的,因为这是一个基准。可以想一下,如果这个contentSize在进行缩放之后发生了变化,那么在
* setScale(1.5f)之后再设置setScale(1.0f)如何能够还原呢?
*/void Node::setContentSize(const Size& size)
{if(!size.equals(_contentSize){   _contentSize = size;_anchorPoints.set(_contentSize.width * _anchorPoint.x, _contentSize.height * _anchorPoint.y);_transformUpdated= _transformDiry = _inverseDirty = _contentSizeiryt = true;}
}

2、其次,我们看看setDimenSions的定义:

/*
Sets the untransformed size of the Label in a more efficient way.
以一种更高效的方式设置Label未转换前的大小
*/void Label::setDimensions(float width, float height)
{if(_overflow == Overflow::RESIZE_HEIGHT){height = 0;}if (height != _labelHeight || width != _labelWidth){_labelWidth = width;_labelHeight = height;_labelDimensions.width = width;_labelDimensions.height = height;_maxLineWidth = width;_contentDirty = true;if(_overflow == Overflow::SHRINK){if (_originalFontSize > 0) {this->restoreFontSize();}}}
}

3、_labelDimensions、_labelWidth、_labelHeight的使用:

在setDimensions的源码中我们看到了主要是对这几个成员变量进行了设置,那么这几个成员变量的使用方法以及相关的作用是什么呢?首先来看看_labelDimensions的使用:

从上图中可以知道,对于_labelDimensions成员变量的使用只在相关的set和get方法中出现了。接下来我们看看_labelWidth和_labelHeight的使用。

从上图中我们可以看到,在alignText方法中使用到了_labelWidth,即在文字的对齐方式中进行了使用。因此我们很自然的可以想到:_labelDimenSions与标签的对齐方式有关。其中setMaxLineWidth也说明了,只有在调用了setDimenSions方法之后,对于标签的对齐方式、显示方式才会生效。

4、实验验证:

auto labTest = Label::createWithSystmeFont("I love China, I am a Chinese", "", 30);
labTetst->setPosition(Vec2(_size.width / 2, _size.height * 0.75f));
this->addChild(labTest, 100);auto labTest2 = Label::createWithSystemFont("I love China, I am a Chinese", "", 30);
labTest2->setPosition(Vec2(m_vSize.width / 2, m_vSize.height * 0.70));
labTest2->setDimensions(200.0f, 80.0f);
this->addChild(labTest2, 100);auto labTest3 = Label::createWithSystemFont("I love China, I am a Chinese", "", 30);
labTest3->setPosition(Vec2(m_vSize.width / 2, m_vSize.height * 0.65));
labTest3->setContentSize(Size(200.0f, 80.0f));
this->addChild(labTest3, 100);

由上述的实验结果我们可以看到,分别使用setDimenSions和setContentSize方法对于Label进行同样大小的设置,但是setContentSize并没有起到什么效果;而使用setDimenSions对Label的设置产生了效果,同时使其进行了自动缩放和换行的调整。

5、结论:

  1. setContentSize和setDimenSions都是设置节点大小,但是对于Label而言,setContentSize并没有什么作用,而是通过使用setDimenSions来进行相关的设置。

  2. 对于Label进行对齐方式、换行等设置也只有在调用了setDimenSions之后才会生效。

二、 Label常用操作封装

1、Label设置下划线:

在公司做产品的过程中遇到这样一个使用场景,需要对Label创建的字体加上一个下划线,但是又没有现成的接口可以设置下划线于是就自己封装了一个。

// Label增加下划线处理
void whStartLayer::labAttachUnderline(Label* labNode)
{if (nullptr == labNode) {return;}float labWidth = labNode->getContentSize().width;auto underLine = DrawNode::create();underLine->drawSegment(Vec2(0, 0), Vec2(labWidth, 0), 1, Color4F::BLACK);labNode->addChild(underLine);return;
}

示例1:

// 创建一个label
auto labPrivacy = Label::createWithSystemFont(u8"隐私协议", "", 40.0f);
labPrivacy->setTextColor(Color4B(0x2e, 0x2e, 0x2e, 0xff));
labPrivacy->setPosition(Vec2(visibleSize / 2));
this->addChild(labPrivacy);
// label增加下划线处理
labAttachUnderline(labPrivacy);

2、Label文本过长的处理方式

目前我在游戏开发的过程中经常会遇见文本内容过长的问题,我个人对于此类问题的处理主要是采用以下两种方式:1,设置label的最大宽度,不进行换行操作,当文本大小超过了最大宽度限定就会进行自动缩放;2,设置label的最大宽度,同时保持字体大小不变,超过最大限度之后之后进行换行处理。

对于第一种处理方式主要适用于标题、按钮文本等内容的处理,文本必须在一行呈现出来才比较美观。

// 标签内容一行呈现,字体进行自动缩放
void setLabAlignInOneLine(Label* labNode, float maxWidth)
{auto curSize = labNode->getContentSize();float dimenWidth = curSize.width > maxWidth ? maxWidth : curSize.width;labNode->setDimensions(dimenWidth, curSize.height);labNode->setOverflow(Label::Overflow::SHRINK);    // 设置溢出处理方式(共有4种):缩放处理labNode->setAlignment(TextHAlignment::CENTER, TextVAlignment::CENTER);return;
}

对于第二种方式,我们保持字体的大小不变,在最大宽度限定下来自动适应高度。其实Label中的溢出处理方式中有一个“Label::Overflow::RESIZE_HEIGHT”,但是设置这个属性之后去获取标签的大小时,高度始终时0,因为这个bug我就放弃了这种处理方式。因为我在使用的过程中还是需要Label的大小去设置相应的位置坐标,因此我采用以下的方式进行处理。

使用过程中自己去判断为了保持字体大小不变,最大宽度限定下实际创建的Label会有多少行,然后手动去设定标签的大小。如果不手动设置标签大小的话,换行之后的部分文本可能无法显示出来。

void setLabAutoHeight(Label * labNode, float maxWidth, TextHAlignment hType, TextVAlignment vType, float lineSpace)
{auto curSize = labNode->getContentSize();int lineNum = (int)(curSize.width / maxWidth) + 1;float dimenHeight = lineNum*(curSize.height + lineSpace) - lineSpace;labNode->setDimensions(maxWidth, dimenHeight);labNode->setAlignment(hType, vType);labNode->setLineBreakWithoutSpace(true);labNode->setLineSpacing(lineSpace);return;
}

示例2:

// 示例代码:string textStr = u8"这是一个标题示例,我们正在做溢出处理测试。";auto labTemp = Label::createWithSystemFont(textStr, "", 40.0f);labTemp->setPosition(Vec2(visibleSize.width / 2, 1000.0f));labTemp->setTextColor(Color4B::BLACK);this->addChild(labTemp);auto labTemp2 = Label::createWithSystemFont(textStr, "", 40.0f);labTemp2->setPosition(Vec2(visibleSize.width / 2, 900.0f));labTemp2->setTextColor(Color4B::BLACK);this->addChild(labTemp2);setLabAlignInOneLine(labTemp2, 600.0f);

示例3:

// 示例代码:// 文本内容一行展示string textStr = u8"这是一个标题示例,我们正在做溢出处理测试。再继续增加一点文字长度!";auto labTemp = Label::createWithSystemFont(textStr, "", 40.0f);labTemp->setPosition(Vec2(visibleSize.width / 2, 900.0f));labTemp->setTextColor(Color4B::BLACK);this->addChild(labTemp);// 水平居中对齐auto labTemp2 = Label::createWithSystemFont(textStr, "", 40.0f);labTemp2->setPosition(Vec2(visibleSize.width / 2, 700.0f));labTemp2->setTextColor(Color4B::BLACK);this->addChild(labTemp2);setLabAutoHeight(labTemp2, 600.0f, TextHAlignment::CENTER, TextVAlignment::CENTER, 0.0f);   // 水平左对齐auto labTemp3 = Label::createWithSystemFont(textStr, "", 40.0f);labTemp3->setPosition(Vec2(visibleSize.width / 2, 500.0f));labTemp3->setTextColor(Color4B::BLACK);this->addChild(labTemp3);setLabAutoHeight(labTemp3, 600.0f, TextHAlignment::LEFT, TextVAlignment::CENTER, 0.0f);  // 水平右对齐auto labTemp4 = Label::createWithSystemFont(textStr, "", 40.0f);labTemp4->setPosition(Vec2(visibleSize.width / 2, 300.0f));labTemp4->setTextColor(Color4B::BLACK);this->addChild(labTemp4);setLabAutoHeight(labTemp4, 600.0f, TextHAlignment::RIGHT, TextVAlignment::CENTER, 0.0f); 

三、Label常用接口说明:

  1. setLineBreakWithoutSpace();
    指定当一行太长的时候对于标签来说会发生什么,该行会在单词之间自动进行断开换行,即标签太长而换行的时候不会将一个完成的单词一分为二。
  2. setMaxLineWith();
    使标签最多不超过该行的未转换宽度,如果该值不为零,则标签的最大线宽将用于强制换行。即限制标签的最大宽度,如果超出之后会进行换行处理。
  3. setDimensions();
    设置标签的大小,前面已经说过了,只要设置了标签的大小之后对于标签的自动换行、缩放、对齐方式等的设置才会有意义。
  4. setOverflow();
    设置标签的移除处理方式,主要有四种处理方式:自动适应、超出区域被裁剪、自动缩放、自动适应高度的方式。
  5. setAlignment();
    设置标签的对其方式,横向、纵向
  6. setLineSpacing();
    设置标签的行距,不支持系统字体

​​​​​​​​​​​​​​​​​​​​​

cocos2dx-标签:Label的使用相关推荐

  1. cocos2dx[3.2]——新字体标签Label

    [唠叨] 在3.x中,废弃了2.x里的LabelTTF.LabelAtlas.LabelBMFont三个字体类,取而代之的是全新的字体标签Label. 实际上Label是将三个字体类进行了融合,进行统 ...

  2. cocos2dx[3.x](6) ——新字体标签Label

    在3.x中,废弃了2.x里的LabelTTF.LabelAtlas.LabelBMFont三个字体类,取而代之的是全新的字体标签Label. 实际上Label是将三个字体类进行了融合,进行统一的管理与 ...

  3. 总结Cocos2d-x 3.0 中新字体标签Label

    来源网址:http://cn.cocos2d-x.org/tutorial/show?id=1624 在3.x中,废弃了2.x里的LabelTTF.LabelAtlas.LabelBMFont三个字体 ...

  4. 小tips:JS之按位取反,语法标签label,正则表达式中replace的0,1是什么?

    JS按位取反 Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算.如 ~1 = -2; ~2 = -3; 来看看~1的计算步骤: 将1(这里叫:原码)转二进制 = 000 ...

  5. java label 标签_Java标签(Label)

    本篇文章帮大家学习java标签(Label),包含了Java标签(Label)使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. Java 中的标签是为循环设计的,是为了在多 ...

  6. k8s标签(label)的使用

    1.在yaml文件里添加标签 apiVersion: v1 kind: Pod metadata:labels:app: test02run: kubia ...... ...... 2.查看列表时显 ...

  7. Java - 标签(label)

    标签(label) 在Java中, 标签必须在循环之前使用, 一个循环之中嵌套另一个循环的开关, 从多重嵌套中continue或break. 语法 label: @Testpublic void te ...

  8. Tk 标签Label下image参数直接调用包含 ImageTk.PhotoImage 的函数时,图片不显示问题

    一:背景 由于标签Label中image参数无法直接使用非gif的图片,所以使用PIL(Python Image Library)库实现非gif图片的使用. 二:修改前的代码 #coding=utf- ...

  9. Bootstrap—标签label和徽章badge

    label .label label-default 默认的灰色标签 .label label-primary "primary" 类型的蓝色标签 .label label-suc ...

  10. 02 标签Label

    标签Label的基本应用 Label()方法可以用于在窗口建立文字或图像标签 语法格式:Label(父对象,options,-) 父对象表示这个标签应当建立在哪个父对象内 其他常用options参数如 ...

最新文章

  1. 腾讯和头条,构建类脑神经元网络的两条路线之争
  2. RTOS ---嵌入式操作系统之时钟节拍下的任务切换
  3. mysql数据库 主主的搭建
  4. Flutter基础—布局模型之水平垂直
  5. python语言的读法-就语法而言,Python 这个语言怎么样?
  6. 动画效果之 Canvas学习-globalCompositeOperation详解
  7. 记录一次.net 4.7.2安装失败解决情况
  8. 2020届恒生电子秋季招聘试卷
  9. STM32F1读取MLX90614ESF非接触式温度传感器
  10. 智慧云教育平台实战项目笔记
  11. 计算机打印机端口配置,如何设置打印机端口,小编教你设置电脑打印机端口
  12. 汇率,汇率接口,汇率行情数据
  13. 【笔记】Android APP 上架 Google Play 采坑记之「应用签名证书」
  14. 未能打开这台计算机上的组策略对象,您可能没有合适的权限
  15. 江西“葫芦夫妻”的“甜蜜”事业
  16. thinkpad联想IBM笔记本为什么出现fan error
  17. Kamiya丨Kamiya艾美捷大鼠微量白蛋白酶联免疫吸附试验说明书
  18. 深度学习细颗粒图像分析综述
  19. 延长SQLyog试用期
  20. 如何写出健壮和优雅的代码?

热门文章

  1. Unity Shader - 翻书效果
  2. Java实现 蓝桥杯 历届试题 矩阵翻硬币
  3. SMART 200 PLC S型速度曲线应用(梯形图算法优化)
  4. 企业ERP系统选C/S架构还是B/S架构?
  5. 基于stm32的汽车智能充电桩设计/单片机/毕业设计/课程设计
  6. 二总线技术为什么下行采用电压信号,上行采用电流信号?是什么传输的
  7. 师古创今匠心品质,打造红木中式整装
  8. 基于JAVA医院医护人员排班系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  9. 收藏夹 -- 常来看看。
  10. ArcGIS学习12:ModelBuilder参数化建模