unity重写软键盘for Android NGUI
一 原因
以为某些原因,需要重写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的更多相关文章
- 【转】Android点击空白区域,隐藏输入法软键盘
原文网址:http://www.2cto.com/kf/201505/401382.html 很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步 ...
- Android控制软键盘的弹出和隐藏
弹出软键盘 前提:必须要有一个可以编辑的控件(EditText),并且当前已经获取焦点 /** * 弹出软键盘 */ public void openKeyboard(View view) { // ...
- 彻底搞定Android开发中软键盘的常见问题
软键盘显示的原理 软件盘的本质是什么?软键盘其实是一个Dialog. InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参 ...
- Android中点击隐藏软键盘最佳方法——Android开发之路4
Android中点击隐藏软键盘最佳方法 实现功能:点击EditText,软键盘出现并且不会隐藏,点击或者触摸EditText以外的其他任何区域,软键盘被隐藏: 1.重写dispatchTouchEve ...
- Android App监听软键盘按键的三种方式
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...
- Android软键盘遮挡的四种解决方案
问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入 ...
- 关于android软键盘enter键的替换与事件监听
android软键盘事件监听enter键 软件盘的界面替换只有一个属性android:imeOptions,这个属性的可以取的值有 normal,actionUnspecified,actionNo ...
- Android点击其他任意位置收起软键盘
在Android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些 ...
- Android学习笔记_点九绘图与软键盘和事件传递
最近项目里遇到的几个小问题,以前只是用吗没有深入看过,现在总结到一起,防止以后这种小问题占用太多时间.还是通过网上别人总结的很多博客学习了,挑选出最易懂明了的. 还有leader很小的问题都不放过,亲 ...
随机推荐
- mui中confirm在苹果出现bug,confirm点击确定跳转页面再返回后,页面被遮罩盖住无法使用
项目中使用confirm mui.confirm('您还未抽奖,现在去抽奖吗?', function (res) { if (res.index === 1) { window.location.hr ...
- leetcode实战
leetcode记录 两数之和 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案. ...
- oracle基本查询
- C语言-第6次作业
1.本章学习总结 1.1思维导图 1.2 本章学习体会 学习感受:先是接触到网络工程导论的建立文件的方式,觉得很方便很好用,而后直接从代码的层面建立文件,觉得很新奇,更加方便,随着大作业的一步一步升级 ...
- IntelliJ IDEA 和 Pycharm 破解
关键网址:http://idea.lanyus.com/ 步骤: 1. 在http://idea.lanyus.com/上下载:JetbrainsCrack-2.9-release-enc.jar . ...
- Python的几个爬虫代码整理(网易云、微信、淘宝、今日头条)
整理了一下网易云歌曲评论抓取.分析好友信息抓取.淘宝宝贝抓取.今日头条美图抓取的一些代码 抓取网易云评论 进入歌曲界面: http://music.163.com/#/song?id=45318582 ...
- C#图像显示实现拖拽、锚点缩放功能【转】
1.图像拖拽 核心步骤: ①新建Point类型全局变量mouseDownPoint,记录拖拽过程中鼠标位置: ②MouseDown事件记录Cursor位置: ③MouseMove事件计算移动矢量,并更 ...
- 【转】解决Android 6.0 NoSuchContextException 和WEBVIEW_undefined 的问题
在 Android 4.4 操作系统上测试混合应用时,可以直接顺利的在native模式和webview模式之间切换,但是在Android6.0 操作系统上却报NoSuchContextExceptio ...
- 初步接触gulp
首先是安装nodejs,通过nodejs的npm全局安装和项目安装gulp,其次在项目里安装所需要的gulp插件,然后新建gulp的配置文件gulpfile.js并写好配置信息(定义gulp任务),最 ...
- C语言实现过滤ASCII在0~127范围内的字符,并去除重复的字符
#include <stdio.h> #include <string.h> /* 1.以字符串作为参数 2.找出ASCII在1~127范围内的字符 3.去掉重复字符 */ i ...