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. 配置phpmyadmin连接远程 MySQL数据库

      引言:1.phpmyadmin程序所在服务器:192.168.1.1,访问地址为:http://192.168.1.1/phpmyadmin2.MySQL数据库所在服务器:192.168.1.2, ...

  2. tomcat下载镜像地址

    镜像地址:http://mirrors.cnnic.cn/apache/tomcat/ typora编写makedown文件 羚羊云api开发:http://doc.topvdn.com/api/in ...

  3. 《即时消息技术剖析与实战》学习笔记7——IM系统的消息未读

    一.什么是消息未读 消息未读包括会话未读和总未读.前者指的是当前用户和某一聊天方的未读消息数,后者指的是当前用户的所有未读消息数,也就是所有会话未读的和.比如用户A收到用户B的2条消息,还收到用户C的 ...

  4. charles 设置为chrome代理

    本文参考:charles 设置为chrome代理 将charles设置为chrome的代理 需要注意的是,Chrome 和 Firefox 浏览器并不一定使用的就是本机,可能是一些代理工具,而 Cha ...

  5. 在Win10右键菜单添加校验文件Hash值命令

    把以下代码保存为reg文件导入注册表即可. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\文件哈希校验] " ...

  6. 微信小程序中scoll-view的一个小坑

    在微信小程序开发中,有时候swiper-view会出现显示不全的问题,我们可以用scoll-view来把它包裹下,但是要用scoll-view就一定要设置height,而我们经常是在页面中加的这个组件 ...

  7. MIT FiveK图像转化--DNG到TIFF,TIFF到JPEG

    MIT FiveK图像转化--DNG到TIFF,TIFF到JPEG MIT FiveK数据库是研究图像自动修饰算法会用到的基准数据库,然而那个网页上提供给我们的5000张原始图像的格式为DNG格式(一 ...

  8. 如何编写出高质量的 equals 和 hashcode 方法?

    什么是 equals 和 hashcode 方法? 这要从 Object 类开始说起,我们知道 Object 类是 Java 的超类,每个类都直接或者间接的继承了 Object 类,在 Object ...

  9. 基于docker构建测试环境

    目录 0x01介绍 0x02 镜像基本操作 0x03 容器基本操作 0x04 容器的修改与保存 0x05 使用Dockerfile定制镜像 0x01介绍 Docker 是一个开源的应用容器引擎,基于 ...

  10. 数据结构之二叉树篇卷二 -- 二叉树递归遍历(With Java)

    一.先序递归遍历(Preorder Recursive Traversal) 1.1 算法 首先需要明确的是这里的序是针对 root 节点而言的.故先序即先“访问”根节点,其次“访问”其左右节点. 1 ...