cocos2d-x CCHTML / RichText Android 版本实现
见我上篇 iOS版本介绍 http://blog.csdn.net/chenee543216/article/details/9305391
-前言:
既然放过话,说要实现android版本就硬着头皮凑一个吧(这玩意,我的项目目前压根没有需求,纯义务劳动了。。。)
话说Android实现的比较蛋疼。。。。 真正要写的时候发现连Java语法也忘记了(可能原先就没有学好,对不起“体育老师”),更别说Android下面那几个绘图相关函数了,发现居然一个都不熟悉。。。所以就一边学一边写。。。不说了,都是泪水。。。
二 中言
1 介绍思路。
2 贴代码
3 分析问题
1、实现原理上篇已经说过了,Android绘制LabelTTF就是通过JNI调用Java canvas drawText() 到一个Bitmap里面,然后把bitmap中的pixel取出来。
既然原先采用HTML标记的方式实现,那么理所当然的就沿用了。我看到cocos2d-x 3.0 预览版本里面是直接通过调用参数来设置属性,这种方式实现相对简单一点,但是扩展性不好。(说错了请轻轻拍)。 而HTML标记,只要实现端添加相应解析代码,可以很容易扩展(臭屁:
)
iOS里面通过调用CoreText可以直接对一段文本设置属性,android这两天看了一下,其实textview的spannable 方式也可以实现类似coreText的功能。(详见:http://developer.android.com/reference/android/text/Spannable.html),但是这里没有采用,因为:我不会,也懒得去学。。。
所以,俺就把
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个地方改动。