Cocos2dx:在安卓平台使用原生输入框

《cocos2d Android 平台EditBox 2.x升级到3.12 输入框使用 原生控件 可以复制 粘贴》
http://blog.csdn.net/Phan_Chen/article/details/53141990

最终解决方案:

  1. 更改windowSoftInputMode为adjustNothing:
    将Cocos2dxActivity.java中的下面一句代码注释掉:
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
    在AndroidMainfest.xml文件中加入:
    android:windowSoftInputMode="adjustNothing|stateHidden"

  2. 在cocos2dx中自己计算并更新输入框的位置:具体为在键盘弹出前,先将editBox移动到键盘的最终位置的上方;这个方案居然能解决光标的问题,也是醉了。
    editBox->setPosition() ;

  3. 待优化接口:
    1键盘高度,2键盘弹出和隐藏回调。

没有达到预期效果的解决方案:

  1. 为布局文件的最顶层加上一个ScrollView布局。
  2. 禁用掉ScrollView的滑动事件。http://blog.csdn.net/u014620028/article/details/53285084
  3. 移植到Cocos2dX 。
  4. 键盘需要设置为adjustResize。
    android:windowSoftInputMode="adjustResize|stateHidden"
  5. 主题不能全屏
    android:theme="@android:style/Theme.NoTitleBar" >

Android原生输入框:
Cocos2dX实现了2个输入框,UIEditBox 和 UITextField.
其中3.7.1版本以后的cocos2dx支持直接调用Android原生输入框,比较好的进行复制,粘贴等操作。

目前Cocos2dx只能下载最早的V3.7.1版本,可能更早的也支持原生输入框。
UITextField是用来替代TextFieldTTF的?
修正:
原生输入框Cocos2dx很早就支持,而支持换行的Android原生输入框,
是从Cocos2dx V3.8的UIEditBox开始的。

IME:是指Input method editor , 即输入法编辑器。

UIEditBox

游戏>主城>更多>好友>搜索:
FriendSearchView -> m_searchBox ;
FriendAddPage -> m_searchBox ; 
游戏>主城>头像>编辑>更换名字:
ChangeNickNameView.m_editBox;
GenCode_ChangeNickName.m_editBox;
ChatView.m_editNode.Add(m_editBox) ;

接口定义:
插入QQ表情:InsertOneChar() ;
键盘显示和隐藏时更新相应位置:UpdatePosition() ;

待解决问题:

  1. 支持多行输入
Cocos2dxEditBox.java
        this.setSingleLine(false) ;
        this.setHorizontallyScrolling(false) ;
  1. 输入时是多行,点击确认后变成单行
Cocos2dxEditBox.java
  1. 文本的跨行选中和复制粘贴有问题
    (这个Bug已经有人提在了谷歌的issuetracker:
    https://issuetracker.google.com/issues/36987452)
EditText Cursor Bug.png

具体表现为,无法跨行选中,无法跨行复制粘贴;就是光标只能在同一行移动,起初怀疑是Cocos2dxEditBox中的onSelectionChanged相关函数不小心屏蔽了Android的某些触摸事件。

Cocos2dxEditBox.java
onSelectionChanged();

后来经过Debug查找得知,
在原生的Android应用中,这种情况也存在。而且,这种情况只会会在输入框的起始位置低于键盘弹出后的位置时才发生。如果键盘弹出后位置在之前输入框之下,则不会发生这种情况。

也就是说,这里不是Cocos2dx的bug,而是Android的Bug。
这里暂时搁置,如果需要,查下Android源码。
而且有个细节,无法跨行选中,并非绝对:
手指拖动光标一直向上滑动,大概经过半屏的距离后光标可以向上移动一行。
所以,如果要定位Android的这个bug,可以作为查找细节。

这种情况目前只在红米3S上出现,不知道是不是MIUI做了定制。尴尬呀真的是。

  1. Cocos2d-x只支持上方对齐。需要添加对齐方式设置接口。
SetVerticalAlignment() ;

  1. 获取文本的实际大小。
随着文本的增加,要不断改变mEditText->setContentSize() 的大小。
所以需要知道当前文本的实际大小。
            TextPaint textPaint = editText.getPaint() ;
            //float textWidth = textPaint.measureText(editText.getText().toString()) ;
            StaticLayout sl = new StaticLayout() ;
  1. 光标跨行选择的问题:
    实现思路:修改Android系统的Bug。
    修改方式:定义一个子类来重写Override相应的函数。(继承)

1)点击和滑动使用的不是同样的位置算法。

HandleView.onTouchEvent()
{
  case MotionEvent.ACTION_MOVE: 
  {
  }
}

//TextView.java
void onDragEvent()
{
case DragEvent.ACTION_DRAG_LOCATION:
                final int offset = getOffsetForPosition(event.getX(), event.getY());
                Selection.setSelection((Spannable)mText, offset);
                return true;
}

TextView.SelectionStartHandleView

OnSpanChganged();

  1. Cocos2dx部分升级:EditBox升级为3.12
UIEditBox目录替换成3.12的目录
platform/android目录下的相关文件替换成3.12的文件。

参考:
http://blog.csdn.net/smileiam/article/details/69055963

你可能感兴趣的:(Cocos2dx:在安卓平台使用原生输入框)