博客> cocos2d Android 平台EditBox 2.x升级到3.12 输入框使用 原生控件 可以复制 粘贴
cocos2d Android 平台EditBox 2.x升级到3.12 输入框使用 原生控件 可以复制 粘贴
1小时前 评论:0 阅读:882 phan.chen
Android cocos2d editbox

原文地址: Enter your link description here:

因项目需求,cocos2d 3.10以下版本中的 editbox 都是使用 ttf 来显示 文字的,使用 ttf 显示的话 很多原生的功能 其实都不好做。比如说 表情,复制,粘贴。(光标其实还容易 可以自己弄个 action) ,目前的很多游戏 聊天系统(其实现在很多的第三方聊天sdk) 或者 输入框系列 体验都很好的。为了追求品质 提高体验做的人性化。然后 又不能 直接 从2.x 直接升级到 3.12 版本(虽然可以升级,但考虑到成本问题而没有升),所以,只升了部分功能~ 好了 说了比较 也说了原因,下面就看看升级的步骤吧。

要升级 分二部分:引擎代码c++ 和 java 代码

一、c++ 引擎部分 想要升级 引擎,就得 看懂 当前版本的 和 你所要升级版本的框架逻辑,先来看 2.x版本的引擎目录部分,如下图: 图 1

CCEditBox 里面的实现 这里不多说了,我们只要知道 editBox 是分平台的,在 create 方法里面 初始化了 平台的实现 m_pEditBoxImpl 这个变量里面的其实就是 对应的平台。

图 2

这里 自己 初始化自己的,互不干扰 ,普通的 editBox 是一个 CCControlButton 在CCControlButton 上面 addChild 了 CCLabelTTF ,但我们点击的时候,调用 openKeyboard 方法调用 JNI( showEditTextDialogJNI)

如图:

图 3

这是传统的editBox:

不能复制 粘贴,不支持表情。(其实也能够做,只是用传统的做这些 会非常的麻烦支持也不会有系统的那么好)

然后。。。。就说说怎么移植吧。

还是一样 看懂 3.12版本的 editBox是怎么实现的。(看懂了在做就不会做无用功的)

3.12版本editbox目录 如图:

图 4

相比较 除了名字都变了之外 还多了层 UIEditBoxImpl-common 这个文件里面 加了新的一些虚函数(都是给android加的)。和2.x相比 其实看 3.12的还是很清晰的 其实 看到这些函数就能够知道,是调用 JNI 的。也就是说。cocos 改变了传统的 editbox 控件方法 传统的 一个 CCControlButton + CCLabelTTF 。

换了之后,可以不需要TTF 了。可以直接使用系统原生的 android 使用的是 EditText 这样的话 其实对于上面说的那些 实现 就太容易了 。

下面 可以看 UIEditBoxImpl-common 添加的那些新 虚函数

图5

都是直接调用到了 java 的 方法

图6

创建(将原来的CCLabelTTF 换成了EditText )、设置字体颜色、大小等等 都需要调用到 java 去实现。

引擎部分的基本逻辑就是这样的 ,其实 java 那变的坑也不浅。主要是 这二者之间的相差还是很大的。不过,幸好 也是可以合的。

二、Java 部分

就 editbox 部分,比之前的 cocos Java 代码 多了 三个 java文件

图7

先看第一个 Cocos2dxEditBox 继承的是 EditText 其实就是 相当于 一个原生的 CCLabelTTF 控件 里面很简单。一看就懂,就是重写了父类里面的一些方法

再看 Cocos2dxEditBoxHelper 其实它就是 Cocos2dxEditBox 的一个辅助类 主要用于 来和 c++ 对接的 图6 中调用的 都会在这个 java 里面

如 createEditBox

图8

图7里面的 都在这里有对应的。一看就懂的

最后一个 是布局文件 ResizeLayout ,它继承了 FrameLayout 布局。 在换行或者是弹出键盘收起键盘 的时候重新设置 布局 就是这么简单的。

以上是步骤,主要坑在于 要怎么把这个 ResizeLayout 放到 游戏层

先是在 CocosActivity 里面 初始化 ResizeLayout

图9

这里主要是 new 一个ResizeLayout 然后 new 一个 editBox 添加到 mFrameLayout 里面

再把 mGLSurfaceView 添加到 mFrameLayout

最后 在 把setContentView(mFrameLayout)

加把 游戏层 和 editbox 都放在了一个 布局里面,然后把这个布局 设置到 activity 的 ContentView

注意 ResizeLayout 这个 得根据自己游戏中 Activity 的逻辑处理 随机应变,我上面说的 ResizeLayout 是 3。12版本的。只是千万不要忘了这样做 不然 点击了是没有任何反应的。

图10

activity onCreate 中 图10 中是在图9走完之后, 调用的 把 当前设置的 ContentView 布局传了过来 给 editbox help类

然后 你会发现 只要正常情况下都会弹出键盘 可以调试,如果在 openKeyboard 的时候 已经过来 缺还是没有弹起键盘 请检查你的 布局文件初始化,或者没有addView到游戏层。

其实到此就应该完成了。

最后:

讲真,我其实是纠结了很久,要不要写的。然而 我发现 写下来的好处有

  1. 如果有朋友需要合并 也可以知道 是可以合的 也可以参考参考。帮助他人

  2. 自己以后也能看 ( 自己现在写的和之后写的差距到底是有多大)

坏处嘛 需要承受心理压力啊哈

其实现在 从2.x版本升级到3.x 成本确实很大 坑也很多。

所以啊 如果能新的就尽量用新的引擎(如目前的稳定版本 3.12) 实在要合就合吧 也还好的。

欢迎大家更正,转载请标明出处原址。谢谢!

收藏
1
sina weixin mail 回到顶部