unity重写软键盘for Android NGUI

摘要:
一个原因是,出于某些原因,有必要重写Unity游戏中Android软键盘的风格。然而,Unity封装了Android和IOS的软键盘。在Unity中,TouchScreenKeyboard Open可以打开一个软键盘,但这个软键盘的操作功能很少,所以本文就是这样写的。其次,本文的主要目的是重写NGUI的UIInput,即触摸屏键盘。打开函数,并调用自己的A

一 原因

以为某些原因,需要重写Unity游戏中Android的软键盘的样式,然而unity对android和ios的ios的软键盘都有封装,在Unity中TouchScreenKeyboard.Open可以打开一个软键盘,然而对这个软键盘的操作函数少的可怜,所以有了这篇文章.

二 目的

本文的主要目的是重写NGUI的UIInput,也就是TouchScreenKeyboard.Open函数,调用自己写的Android原生的键盘

三 准备

需要Android的环境 jdk sdk 还有eclise,不会安装的请百度自行安装,unity 和 ngui插件

四 实现原理

首先需要建立一个Android的工程,里面内容很简单,只要一个Activity和一个EditText,并且当打开这个工程Activity的时候,自动弹出一个软键盘,这很容易实现,当unity中有需要打开软键盘的时候,unity跳转到这个Activity,按下软键盘的完成键把数据传回到Unity.

五 Android库的实现

public class SDKActivity extends Activity {    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {        
        Resources resources = this.getResources();//加载res资源
        String packageName = this.getPackageName();//包名
        int id = resources.getIdentifier("activity_sdk", "layout", packageName);//获取Activity的layout
        super.onCreate(savedInstanceState);
        setContentView(id);
        //设置Activity中的EditText,为了打开软键盘
        final EditText textArea = (EditText)findViewById(resources.getIdentifier("textArea", "id", packageName));        
        textArea.setText("");
        textArea.setBackgroundColor(0x00000000);
        textArea.setTextColor(0x00000000);
        textArea.setFocusableInTouchMode(true);
        textArea.requestFocus();
        textArea.setCursorVisible(true);
        TextWatcher textWatcher = new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        };
        
        textArea.addTextChangedListener(textWatcher);
        //点击了软键盘的完成
        textArea.setOnEditorActionListener(new OnEditorActionListener()
        {

            @Override
            public boolean onEditorAction(TextView arg0, int arg1,KeyEvent arg2)
            {                
                Log.e("点击", "完成");  
                SendData(0,arg0.getText().toString());
                finish();
                return true;
            }           
        });
    }
    
    // 向unity返回数据
    void SendData(int code, String info)
    {
        UnityPlayer.UnitySendMessage("Plugins", "OnCustomInputAction",info);
    }        
}

代码很简单,就是在OnCreate中设置一下EditText的属性,在点击的软键盘的完成键后SendData向Unity返回数据

还需要一个类用来供Unity调用,用来打开这个Activity,也就是打开这个软键盘

public class AndroidKeyboard 
{
    Activity context = null;
    InputMethodManager inputMethodManager = null;
    TextWatcher textWatcher = null;
    boolean mode = false;
    
    public AndroidKeyboard() 
    {
        context = UnityPlayer.currentActivity;
        inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);                        
    }
    
    //打开Activiy,并且显示输入法
    public void Open(final String text,final boolean mode)
    {
        if(context == null) 
        {
            Log.e("unity", "context null when open keyboard");
            return ;
        }
        context.runOnUiThread(new Runnable() 
        {
            @Override
            public void run()
            {
                Log.e("unity", "1111111111111");
                Intent intent = new Intent();
                intent.setClassName(context, "com.android.keyboardsdk.SDKActivity");
                context.startActivity(intent);               
            }
        });

    }

}

代码没什么好说的,就是Unity调用Open函数的时候打开这个Activity,并且显示软键盘

六 unity资源设置和AndroidManifest.xml设置

主要是设置上面的Activity的layout和软键盘的属性

附上Acitvity的xml,里面就放了一个EditText

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical|center_horizontal" >
    <EditText
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:inputType="textNoSuggestions|textMultiLine"
        android:ems="10"
        android:imeOptions="actionDone"
        android:id="@+id/textArea"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:textSize="0.01dp"
        android:gravity="top" />
</RelativeLayout>

然后需要在Unity的AndroidManifest.xml中设置

    <activity  
        android:configChanges="keyboard|keyboardHidden|orientation"
        android:screenOrientation="landscape"
        android:windowSoftInputMode="adjustResize|stateVisible"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
        android:name="com.android.keyboardsdk.SDKActivity">                   
    </activity>

主要是注册一下上面创建的Activity,不然在unity调用后打不开

七 unity中调用这个库,并打开软键盘

把上面创建的lib导出后放到unity中就可以提供给unity使用了

AndroidJavaObject _input= new AndroidJavaObject("com.android.keyboardsdk.AndroidKeyboard");
_input.Call("Open", text, multiLines);

这两行代码很好理解,就是new了一个AndroidKeyboard类的实例(上面你自己创建的),并且调用了Open函数

最后还要接收一下Android软键盘传回来的消息,就是SendData函数传递回来的

UnityPlayer.UnitySendMessage("Plugins", "OnCustomInputAction",info);

需要在unity创建一个名字为Plugins的GameObject,然后挂上一个脚本,实现函数OnCustomInputAction即可

    void OnCustomInputAction(string data)
    {
    //data就是软键盘传回来的数据
    }

八 替换掉NGUI UIInput的TouchScreenKeyboard.Open,并实现相关的逻辑,因为ngui版本不同,我就不多废话

免责声明:文章转载自《unity重写软键盘for Android NGUI》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇华为卡刷包线刷方法ant design pro (十六)advanced 权限管理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity Android路径及注意事项

Application.temporaryCachePath==/storage/emulated/0/Android/data/com.***.***/cache Application.persistentDataPath==/storage/emulated/0/Android/data/com.***.***/files 或许你碰到过,在电脑读取该...

Android 的窗口管理系统 (View, Canvas, WindowManager)

http://blog.csdn.net/ritterliu/article/details/39295271 From漫天尘沙 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道Android 应用程序是怎么创建出来的,大概的流程是 ActivityManagerService -> Zygote...

彻底搞定Android开发中软键盘的常见问题

软键盘显示的原理 软件盘的本质是什么?软键盘其实是一个Dialog。 InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或...

unity探索者之微信分享所有流程,非第三方插件

版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7560575.html  很久没有写新博客了,前段时间有些忙,这几天趟了几个微信分享的坑,写下来和大家分享下 接过微信分享的人,不论是直接接的微信自己的sdk还是使用了第三方插件,比如友盟、Mob之类的,估计都被微信官方恶心过。因为微信官方的...

使用 async-await 简化代码的检讨

  从API版本升级到4.6之后, Unity支持了async和await语法, 并且根据测试来看, 它运行在主线程里, 跟一般的C#编译不大一样, 这就很有操作空间了, 先来看看普通C# Console工程和Unity中运行的差别:   1. C# Console using System; namespace AsyncTest { clas...

软键盘弹起,导致底部被顶上去

计算出可视界面的高度,当软键盘弹起时让底部元素隐藏掉, 当键盘收起时再让它显示,实在没办法时这种方法也不失为一种方法 1 var h=document.documentElement.clientHeight; 2 $(window).resize(function(){ 3 let height=document.documentElement....