最近文章

联系方式
最近文章

当前位置:主页 > 最近文章 >

Android 上的 制表符(tab) —— 一个神奇的字符 (cocos2dx crash)

发布时间:2019/01/28  作者:环亚

今天测试发现了游戏的一个问题,系统邮件,如果发了tab,在android上一打开邮件内容就会crash。而且他们很确定是tab的问题。


凭我多个月的经验(确实没多年。。。)来看,从来没听说在android上会因为一个tab崩溃,而且如果有这个问题,肯定会有很多人遇到,估计早就吵翻天了,搜索了一下,什么可用信息都没有。

于是写个测试工程测试了一下,分别在mac下和windows下,用文本编辑工具编辑了4个txt文档,utf有bom和无bom,内容是“ tab abcd ”,发现都能正常显示,也不会crash。如下:

    unsigned long fSize = 0;
    unsigned char *data = CCFileUtils::sharedFileUtils()->getFileData("tab.txt", "rb", &fSize);
    
    CCLabelTTF *label = CCLabelTTF::create((const char*)data, "abc", 30);
    label->setPosition(ccp(visibleSize.width/2, visibleSize.height/2));

    addChild(label);

然后开始怒跟代码,发现工程中使用了一个自定义控件,是为了实现一个富文本框的功能。所谓富文本框就是能显示各种颜色,能显示url,有的东西还能点的那种。但是这个东西的实现,其中有一步,是把一个utf8字符串拆开,拆成单个字符,把每个字符的纹理做出来,然后来拼图,拼成一个文本框。那么tab肯定会被拆成单个字符,最后发现就是在生成这个tab的纹理的时候,crash了。堆栈如下:

vcD4KPHA+ICAgIMi7uvPV0rT6wuujrNTaQ0NUZXh0dXJlMkTPwtXStb3Jz8PmttHVu7XE1+6689K7sr2jrMjnz8KjujwvcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">bool CCTexture2D::initWithString(const char *text, const char *fontName, float fontSize, const CCSize& dimensions, CCTextAlignment hAlignment, CCVerticalTextAlignment vAlignment) { … … … … do { CCImage* pImage = new CCImage(); CC_BREAK_IF(NULL == pImage); bRet = pImage->initWithString(text, (int)dimensions.width, (int)dimensions.height, eAlign, fontName, (int)fontSize); CC_BREAK_IF(!bRet); bRet = initWithImage(pImage); CC_SAFE_RELEASE(pImage); } while (0); … … … … return bRet; } 这里第一步是,new一个image出来,然后用文字去init这个image,然后再用这个image去init这个texture。我们接着看init这个image这里,android下的代码是这样的:

bool CCImage::initWithString(
                               const char *    pText, 
                               int             nWidth/* = 0*/, 
                               int             nHeight/* = 0*/,
                               ETextAlign      eAlignMask/* = kAlignCenter*/,
                               const char *    pFontName/* = nil*/,
                               int             nSize/* = 0*/)
{
    bool bRet = false;

    do 
    {
        CC_BREAK_IF(! pText);
        
        BitmapDC &dc = sharedBitmapDC();
        CC_BREAK_IF(! dc.getBitmapFromJava(pText, nWidth, nHeight, eAlignMask, pFontName, nSize));

        m_pData = dc.m_pData;
        CC_BREAK_IF(! m_pData);

        m_nWidth    = (short)dc.m_nWidth;
        m_nHeight   = (short)dc.m_nHeight;
        m_bHasAlpha = true;
        m_bPreMulti = true;
        m_nBitsPerComponent = 8;

        bRet = true;
    } while (0);

    return bRet;
}
其中重点是getBitmapFromJava这个函数,如下

    bool getBitmapFromJava(const char *text, int nWidth, int nHeight, CCImage::ETextAlign eAlignMask, const char * pFontName, float fontSize)
    {
    	return  getBitmapFromJavaShadowStroke(	text, nWidth, nHeight, eAlignMask, pFontName, fontSize );
    }
从这里就知道了,肯定是把文字,字体,字号这些东西,叫给java层,让它们调用系统相关的东西,返回一个bitmap回来,然后就是下一步,把这个返回的image去初始化texture。但是不需要下一步了,因为到这就crash了,得到如下log:



    tabTest
    		Hello world!
    Settings


果然还是没显示tab,哈哈哈哈哈,收工~~


总结:android系统会忽略tab,在cocos2dx里面用CCLabelTTF的时候,如果文本内容只有一个tab字符,会crash。

http://www.bkjia.com/Androidjc/821608.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/821608.htmlTechArticle今天测试发现了游戏的一个问题,系统邮件,如果发了tab,在android上一打开邮件内容就会crash。而且他们很确定是tab的问题。 凭我多个月的...

本文源自: 环亚娱乐

上一篇:三、android中Handle类的用法

下一篇:没有了

返回列表
环亚娱乐_环亚娱乐AG国际厅_环亚娱乐AG最佳线路_腾讯财经 | 最近文章 | 架构说 | 架构技术 | 开发者娱乐 |

Copyright © 2005-2016 http://www.shopbwc.com 环亚娱乐_环亚娱乐AG国际厅_环亚娱乐AG最佳线路_腾讯财经版权所有 环亚娱乐_环亚娱乐AG国际厅_环亚娱乐AG最佳线路_腾讯财经