1. 简介

Label直接继承了Node LabelProtocol BlendProtocol,用于渲染文本,让文本呈现的效果丰富。

Label有4种类型,:

    enum class LabelType {
TTF,
BMFONT,
CHARMAP,
STRING_TEXTURE
};

Label文本呈现的效果:

enum class LabelEffect {
NORMAL,
OUTLINE,
SHADOW,
GLOW,
ITALICS,
BOLD,
UNDERLINE,
STRIKETHROUGH,
ALL
};

针对Label大小范围与文本长度冲突时的4种操作,用枚举定义:

    enum class Overflow
{
//In NONE mode, the dimensions is (0,0) and the content size will change dynamically to fit the label.
NONE,
/**
*In CLAMP mode, when label content goes out of the bounding box, it will be clipped.
*/
CLAMP,
/**
* In SHRINK mode, the font size will change dynamically to adapt the content size.
*/
SHRINK,
/**
*In RESIZE_HEIGHT mode, you can only change the width of label and the height is changed automatically.
*/
RESIZE_HEIGHT
};

1

2. 构造函数

从构造函数得知:

锚点(0.5,0.5)

调用reset()方法

LabelType默认STRING_TEXTURE

LabelEffect默认NORMAL

设置了默认字体和大小

label长宽大小默认0

对齐方式默认LEFT TOP

文本颜色默认白色,效果颜色默认黑色

Overflow默认NONE

3. create

create()

创建空的label对象和指针。

createWithSystemFont

Label* createWithSystemFont(const std::string& text, const std::string& font, float fontSize,
const Size& dimensions = Size::ZERO, TextHAlignment hAlignment = TextHAlignment::LEFT,
TextVAlignment vAlignment = TextVAlignment::TOP)

共6个参数:

  • string& text 要显示的字符串
  • string& font 字体,字体名/字体文件
  • float fontSize 字体大小,必须大于0
  • Size& dimensions = Size::ZERO label大小,默认Size(0, 0)
  • TextHAlignment hAlignment = TextHAlignment::LEFT 水平对齐方式,默认左对齐
  • TextVAlignment vAlignment = TextVAlignment::TOP 垂直对齐方式,默认顶部对齐

实现:

    auto ret = new (std::nothrow) Label(hAlignment,vAlignment);
if (ret)
{
ret->setSystemFontName(font);
ret->setSystemFontSize(fontSize);
ret->setDimensions(dimensions.width, dimensions.height);
ret->setString(text); ret->autorelease(); return ret;
}
return nullptr;

通过set方法用参数进行set。

  • setSystemFontName
    _systemFont设为参数字体
    _currentLabelType = LabelType::STRING_TEXTURE
    _systemFontDirty = true
  • setSystemFontSize 
    _systemFontSize _originalFontSize 设为参数字体大小
    _currentLabelType = LabelType::STRING_TEXTURE;
    _systemFontDirty = true  
  • setDimensions
    如果Overflow为RESIZE_HEIGHT类型,先将参数height设0

    _labelWidth = width;
    _labelHeight = height;
    _labelDimensions.width = width;
    _labelDimensions.height = height;
    _maxLineWidth = width; //最大文本宽度

    _contentDirty = true;

    如果Overflow是SHRINK类型,

      if (_originalFontSize > 0) {
              this->restoreFontSize();
          }

  • setString
    _utf8Text _utf32Text 都存储了set的字符串

createWithTTF

有2种重载方法:

  • 方法1:参数中用string& fontFilePath指定字符串字体文件.ttf路径

    Label * createWithTTF(const std::string& text, const std::string& fontFilePath, float fontSize,
    const Size& dimensions = Size::ZERO, TextHAlignment hAlignment = TextHAlignment::LEFT,
    TextVAlignment vAlignment = TextVAlignment::TOP)

    参数中没有ttf,利用参数生成对应的ttf,之后调用了setTTFConfig(ttfConfig)
    还调用了setDimensions(dimensions.width, dimensions.height); setString(text);

  • 方法2:参数中用TTFConfig设置字体,maxLineWidth值为最大文本行宽(默认为0, 表示不设置)
    Label* createWithTTF(const TTFConfig& ttfConfig, const std::string& text,
    TextHAlignment hAlignment = TextHAlignment::LEFT, int maxLineWidth = )

    对参数ttfConfig调用了setTTFConfig(ttfConfig),之后执行setMaxLineWidth(maxLineWidth); setString(text);

字体配置TTFConfig是一个结构体:

typedef struct _ttfConfig
{
std::string fontFilePath; //字体文件路径,默认空
float fontSize; //字体大小,默认12 GlyphCollection glyphs; //字符集,默认DYNAMIC
const char *customGlyphs; //自定义字符集, 默认无 bool distanceFieldEnabled; //是否字体紧凑,默认false
int outlineSize; //字体轮廓大小,默认0 bool italics; //是否斜体,默认false
bool bold; //是否粗体,默认false
bool underline; //是否有下划线,默认false
bool strikethrough; //是否有删除线,默认false _ttfConfig(..........)
: fontFilePath(filePath)
, fontSize(size)
, glyphs(glyphCollection)
, customGlyphs(customGlyphCollection)
, distanceFieldEnabled(useDistanceField)
, outlineSize(outline)
, italics(useItalics)
, bold(useBold)
, underline(useUnderline)
, strikethrough(useStrikethrough)
{
if(outline > )
{
distanceFieldEnabled = false;
}
}
} TTFConfig;

setTTFConfig(ttfConfig)

先执行_originalFontSize = ttfConfig.fontSize

再调用setTTFConfigInternal(ttfConfig)

_currentLabelType = LabelType::TTF

createWithBMFont

参数中包括BMFont软件生成的.fnt文件路径和显示的文本。字符串必须和.fnt文件定义的文本一致,否则多余的不显示。

Label* createWithBMFont(const std::string& bmfontPath, const std::string& text,
const TextHAlignment& hAlignment = TextHAlignment::LEFT, int maxLineWidth = ,
const Vec2& imageOffset = Vec2::ZERO)

调用了setBMFontFilePath(bmfontFilePath,imageOffset),_currentLabelType = LabelType::BMFONT

调用了setMaxLineWidth(maxLineWidth) setString(text);

我们使用BMFont能生成自定义字体,软件导出.fnt字体信息文件和.png字体图片文件,两文件放在同一目录被Cocos2dx使用。

createWithCharMap

有三种重载方法:

Label * createWithCharMap(const std::string& charMapFile, int itemWidth, int itemHeight, int startCharMap)
Label * createWithCharMap(Texture2D* texture, int itemWidth, int itemHeight, int startCharMap)
Label * createWithCharMap(const std::string& plistFile)

创建方式分为三种:

  • 通过.png图片文件
  • 通过Texture2D纹理
  • 通过.plist文件

前两种方式要在参数中设置表示字符的每个小图的长宽、起始的下标值startCharMap(ASCII,用'0'代替48)。.plist则已经包含了这些参数。

每种重载都调用了对应的setCharMap,其中调用了对应的FontAtlasCache::getFontAtlasCharMap生成newAtlas,再执行

  _currentLabelType = LabelType::CHARMAP
  setFontAtlas(newAtlas)

- TTF BMFont CharMap

TTF统一配置字体属性,对label中所有文本都有效。

BMFont需要.fnt .png文件,使用时仅需要.fnt路径,.fnt类似于.plist,通过文本内容选择大图.png中对应的字符。

CharMap可以看作BMFont的简化版,通过ASCII读取大图里不同的字符。

4. 渲染特效

Label提供了三种字体特效:

  • Shadow 阴影
  • Outline 描边
  • Glow 发光

三种特效设置方式:

enableShadow(const Color4B& shadowColor = Color4B::BLACK,const Size &offset = Size(,-), int blurRadius = )
enableOutline(const Color4B& outlineColor,int outlineSize = -)
enableGlow(const Color4B& glowColor)

描边Outline和发光Glow只支持createWithTTF创建的label。且两者同时使用时,仅后设置的显示。

阴影Shadow的Size是以label的左上角为基准点设置阴影的位置的。

5. 对齐方式

Label默认的对齐方式是LEFT+TOP。

分为水平方向和竖直方向,对应Label两个成员:

    TextHAlignment _hAlignment; //水平
TextVAlignment _vAlignment; //竖直

定义两个枚举:

enum class CC_DLL TextVAlignment
{
TOP,
CENTER,
BOTTOM
}; enum class CC_DLL TextHAlignment
{
LEFT,
CENTER,
RIGHT
};

相关set get方法:

    void setAlignment(TextHAlignment hAlignment) { setAlignment(hAlignment,_vAlignment);}
TextHAlignment getTextAlignment() const { return _hAlignment;}
void setAlignment(TextHAlignment hAlignment,TextVAlignment vAlignment);
void setHorizontalAlignment(TextHAlignment hAlignment) { setAlignment(hAlignment,_vAlignment); }
TextHAlignment getHorizontalAlignment() const { return _hAlignment; }
void setVerticalAlignment(TextVAlignment vAlignment) { setAlignment(_hAlignment,vAlignment); }
TextVAlignment getVerticalAlignment() const { return _vAlignment; }

6. 范围大小

label所处的文本框大小,涉及变量:

    Size _labelDimensions;
float _labelWidth;
float _labelHeight;

相关get set方法:

    void setWidth(float width) { setDimensions(width,_labelHeight);}
float getWidth() const { return _labelWidth; } void setHeight(float height){ setDimensions(_labelWidth, height); }
float getHeight() const { return _labelHeight; } void setDimensions(float width, float height);
const Size& getDimensions() const{ return _labelDimensions;}

设置尺寸使用setDimensions,而不是Node的setContentSize。setDimensions主要逻辑:

_labelWidth = width;
_labelHeight = height;
_labelDimensions.width = width;
_labelDimensions.height = height;
_maxLineWidth = width;

-

7. 文本 字体 大小 颜色

    virtual void setSystemFontName(const std::string& font);
virtual const std::string& getSystemFontName() const { return _systemFont;} virtual void setSystemFontSize(float fontSize);
virtual float getSystemFontSize() const { return _systemFontSize;} virtual void setString(const std::string& text) override;
virtual const std::string& getString() const override { return _utf8Text;  }
 
//仅ttf systemfont
  virtual void setTextColor(const Color4B &color);
  const Color4B& getTextColor() const { return _textColor;}

-

8. 自动换行 行间距

- void setLineBreakWithoutSpace(bool breakWithoutSpace)

是否开启换行功能,设置了属性_lineBreakWithoutSpaces。

- void setMaxLineWidth(float maxLineWidth)

设置最大行宽,需要_labelWidth为0时才能继续设置,否则我们仅通过_labelWidth就能实现自动换行。设置了属性_maxLineWidth。

- label尺寸相关

涉及到_labelDimensions _labelWidth _labelHeight。

    void setWidth(float width) { setDimensions(width,_labelHeight);}
float getWidth() const { return _labelWidth; } void setHeight(float height){ setDimensions(_labelWidth, height); }
float getHeight() const { return _labelHeight; } void setDimensions(float width, float height);
const Size& getDimensions() const{ return _labelDimensions;}

- void setLineHeight(float height) / float getLineHeight()

直接修改属性_lineHeight。行间距不支持System Font。

- void setAdditionalKerning(float space) / float getAdditionalKerning()

字符间距修改属性_additionalKerning,不支持System Font。

-

‎Cocos2d-x 学习笔记(18) Label的更多相关文章

  1. Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel

    Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只 ...

  2. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  3. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  4. springmvc学习笔记(18)-json数据交互

    springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...

  5. cocos2d-x学习笔记(18)--游戏打包(windows平台)

    cocos2d-x学习笔记(18)--游戏打包(windows平台)           之前做好的游戏,都是在vs2008下编译执行的.假设说想把游戏公布到网上或者和其它人一起分享游戏,那就得对游戏 ...

  6. Hadoop学习笔记—18.Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  7. [原创]java WEB学习笔记18:java EE 中的MVC 设计模式(理论)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. C语言实例解析精粹学习笔记——18

    <C语言实例解析精粹>中编译环境采用的是Turbo C 2.0.但是这个编译器年代久远,较新的编译器对书中的某些例子支持不好,在学习的时候同时做一些笔记. 实例18:将一个无符号整数转换为 ...

  9. NodeJS学习笔记 (18)基础调试-console(ok)

    模块概览 console模块提供了基础的调试功能.使用很简单,常用的API主要有 console.log().console.error(). 此外,可以基于Console类,方便的扩展出自己的con ...

随机推荐

  1. C#中Path类的常用方法

    场景 打开VS,输入Path,我们可以看到其定义. 都是静态方法,所以我们可以使用类名直接调用. 实现 新建命令行程序,编码如下: string str = @"C:\Users\Admin ...

  2. Java 开发中常用的网站地址

    博客地址:http://www.moonxy.com 一.前言 在日常的开发中,通常需要访问或者设置不同的网站来获取需要的数据,不如我们都知道 Linux 系统版本比较多(例如:Ubuntu.Cent ...

  3. 关于W3Cschool定义的设计模式-常用的9种设计模式的介绍

    一.设计模式 tip:每种设计模式,其实都是为了更高效的,更方便的解决在面对对象编程中所遇到的问题. 什么是设计模式:     是一套经过反复使用.多人知晓的.经过分类的.代码设计经验的总结   为什 ...

  4. 55 (OC)* 图片圆角处理

    iOS图片设置圆角性能优化   问题 圆角虽好,但如果使用不当,它就是你的帧数杀手,特别当它出现在滚动列表的时候.下面来看圆角如何毁掉你的流畅度的. 实测 layer.cornerRadius 我创建 ...

  5. js中Math对象常用的属性和方法

    1 Math对象 1.1定义:Math是js的一个内置对象,它提供了一些数学方法. 1.2特性:不能用构造函数的方式创建,无法初始化,只有静态属性和方法 1.3静态属性 1.3.1 Math.PI 圆 ...

  6. linux 堆栈查看

    top -c 查看进程ID pstree PID 查看线程树 pstack PID 查看堆栈

  7. jmeter基础使用

    1.ServerAgent是服务端的插件2.下载成功后,复制JmeterPlugins-Extras.jar和JmeterPlugins-Standard.jar两个文件,放到jmeter安装文件中的 ...

  8. maven 3.6的安装

    呵呵,按网上的步骤不能安装maven3.6,所以降低版本.因为3.6的没有bin文件夹. 下载地址:https://archive.apache.org/dist/maven/maven-3/3.5. ...

  9. MySQL在Linux系统环境的安装和无主机登录配置

           将mysql 安装在单个Linux系统主机,并配置本地或远程(此处可仅单指局域状态下的环境)的无主机登录.谨记的是:操作完mysql 设置时,需以flush privileges进行权限 ...

  10. 3.form表单

    1.Form标签:用来将表单外的内容与表单进行关联.其主要元素有input,button,select. action属性:指定表单的发送地址. Novalidate属性:数据提交时不校验. Targ ...