在NGUI的UILabel中使用动态字体与表情

该博客介绍了如何在NGUI的UILabel中实现动态字体与表情的混合显示。通过在ProcessText方法中检测文本表情,动态创建UITexture显示表情,避免内存开销。作者提供了自定义的EmojiProvider,并讨论了未解决的问题,如不支持多张贴图和编辑模式下UV坐标混乱。
摘要由CSDN通过智能技术生成

前言


众所周知,UILabel的静态字体是支持表情的,不过需要将表情与文字打包到一个图集中,并且因为受限于静态字体,几乎不适用于中文日文等文字的图文混排。

这几天因为项目需要研究了一下动态字体中使用表情的解决方案,不过好像并没有搜到比较好的方案,最终研究了一下NGUI中的源码,决定采取类似于UIInput生成光标和高亮的做法。


原理

原理基本上就是在UILabel每次处理文本的ProcessText方法中判断当前文本是否含有表情符号,如果有,就在UILabel下添加一个UITexture,并将计算好的顶点坐标和UV坐标写入UITexture中;另外还需要相应的修改NGUIText中计算顶点坐标和UV坐标的类,确保UILabel中文字的坐标空出了表情的位置。

直观一点描述就是,UILabel中只显示文字,UITexture中显示表情,这两个控件叠在一起就形成了图文混排的效果。

从目前达到的效果来看还算不错,需要显示表情时会动态创建UITexture,并不会带来过多的内存开销,另外我给UILabel加了useEmoji这个开关来控制是否检查表情,默认为false,如果某些UILabel需要显示表情,就给设成true就好,当然也可以在代码中修改。

另外我又给UILabel加了emojiAlignment这个属性,可以控制表情和文字的垂直对齐方式,默认的选项是Top,即表情和文字的上边缘对齐;Center则垂直居中对齐;当然比较常见的应该是Bottom对齐,即下边缘对齐。


使用

使用起来也比较方便,只需要实现你自己的EmojiProvider,并赋值给UILabel就可以了。

public abstract class EmojiProvider {
    public delegate bool EmojiFilter(string text, EmojiVO symbol);
    public EmojiFilter emojiFilter;


    public virtual Texture mainTexture {
        get {
            throw new System.NotImplementedException();
        }
    }

    public abstract bool HasEmojis(string text);

    public BMSymbol MatchEmoji(string text, int offset = 0)
    {
        if (string.IsNullOrEmpty(text))
            return <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值