首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

cocos2d-x CCHTML / RichText Android 版本兑现

2013-10-08 
cocos2d-x CCHTML / RichText Android 版本实现见我上篇 iOS版本介绍http://blog.csdn.net/chenee543216/a

cocos2d-x CCHTML / RichText Android 版本实现

见我上篇 iOS版本介绍   http://blog.csdn.net/chenee543216/article/details/9305391


-前言:

既然放过话,说要实现android版本就硬着头皮凑一个吧(这玩意,我的项目目前压根没有需求,纯义务劳动了。。。cocos2d-x CCHTML / RichText Android 版本兑现

话说Android实现的比较蛋疼。。。。 真正要写的时候发现连Java语法也忘记了(可能原先就没有学好,对不起“体育老师”),更别说Android下面那几个绘图相关函数了,发现居然一个都不熟悉。。。所以就一边学一边写。。。不说了,都是泪水。。。


cocos2d-x CCHTML / RichText Android 版本兑现




二 中言

1 介绍思路。

2 贴代码

3 分析问题


1、实现原理上篇已经说过了,Android绘制LabelTTF就是通过JNI调用Java canvas drawText() 到一个Bitmap里面,然后把bitmap中的pixel取出来。

 既然原先采用HTML标记的方式实现,那么理所当然的就沿用了。我看到cocos2d-x 3.0 预览版本里面是直接通过调用参数来设置属性,这种方式实现相对简单一点,但是扩展性不好。(说错了请轻轻拍cocos2d-x CCHTML / RichText Android 版本兑现)。 而HTML标记,只要实现端添加相应解析代码,可以很容易扩展(臭屁:cocos2d-x CCHTML / RichText Android 版本兑现


iOS里面通过调用CoreText可以直接对一段文本设置属性,android这两天看了一下,其实textview的spannable 方式也可以实现类似coreText的功能。(详见:http://developer.android.com/reference/android/text/Spannable.html),但是这里没有采用,因为:我不会,也懒得去学。。。cocos2d-x CCHTML / RichText Android 版本兑现


所以,俺就把 

String s = "Hllo,<font face='HelveticaNeue-CondensedBold' size=60 color='#00CC00'>先生</font>早上好,<a href='action=show'><font color='#FF00FF'>要吃点什么呢?</font>你到底\n吃不吃?</a>\n您的金钱:<a href='item=ID10086'><font color='#FF0000'>2000</font></a>"

这玩意根据不同的属性(android Paint)拆分成一段一段,然后计算位置,一段一段的去drawText(s,x,y,paint);


分2步,第一步解析HTML <> </> 对,生成component,第二步解析component 生产textInfo,textInfo就是直接提供给canvas 去draw text的信息。

具体,见代码吧。


2、代码在这里。。。。。

md,为毛贴不上来??? 擦,一直点取消。。。。怨念啊 。。。

主要就是修改Android项目proj.android\src\org\cocos2dx\lib\Cocos2dxBitmap.java 文件(win下面,linux改\\为 //);

    void Java_org_cocos2dx_lib_Cocos2dxBitmap_nativeInitBitmapDC(JNIEnv*  env, jobject thiz, int width, int height, jbyteArray pixels)    {        int size = width * height * 4;        cocos2d::sharedBitmapDC().m_nWidth = width;        cocos2d::sharedBitmapDC().m_nHeight = height;        cocos2d::sharedBitmapDC().m_pData = new unsigned char[size];        env->GetByteArrayRegion(pixels, 0, size, (jbyte*)cocos2d::sharedBitmapDC().m_pData);//我擦,为毛老是编辑出错,大家通过“Plain”模式来看代码吧。。。。return;//这里直接返回,不要调用下面的转换代码。//这个转换代码是将所谓的ARGB--> RGBA ,但是实测是有问题的,只是原先对于WHITE "#FF FF FF FF"这种特例来说是ok的。        // swap data        unsigned int *tempPtr = (unsigned int*)cocos2d::sharedBitmapDC().m_pData;        unsigned int tempdata = 0;        for (int i = 0; i < height; ++i)        {            for (int j = 0; j < width; ++j)            {                tempdata = *tempPtr;                *tempPtr++ = cocos2d::sharedBitmapDC().swapAlpha(tempdata);            }        }    }



具体现象就是无论怎么设置,颜色就是显示不正常,设置Paint.SetColor(Color.Black),居然显示成红色。

通过把一模一样的BitMap直接在Android里面显示,发现Android层面是正确的。那么只可能是Cocos2dx端的问题。


分析 黑色FF 00 00 00 显示成红色 FF FF 00 00 ,前面的FF是Alpha。说明 >>8 了,那么在Java层面把Paint.setColor(Color.BLACK << 8);进行测试,发现显示正常。说明猜测的正确。又试验了几个发现果然猜测正确,这也充分说明了,小时候不看书,直接带只筛子(自制)去考场也能门门高分的天赋~~



4、说了那么多废话饿了。回家吃饭。代码就不上传了吧,就2个文件改动而已,比iOS简单多了。


有需要工程的童鞋留言吧。


5 、 另外,代码就实现了<a > <font>的样式而已,回调函数没有写 :囧。这个这个这个。。。。。是因为。。。。。懒!


6,有哥们问<a>的回调函数点击了,原先iOS的支持,android没有做,其实方法和iOS版本一样,额外写个JNI函数把<a> </a>的Rect传递回去就可哦了。




1楼anndaming2013-08-28 12:20
有源码么???396583550@qq.com
Re: chenee543216前天 09:07
回复anndamingn源码贴在文章里面了,懒得弄工程上传了。就2个地方改动。

热点排行