目录:
1、导读;
2、Android 输入法开发简介及流程;
3、斗图 APP 开发介绍;
4、斗图 APP 功能优化;
5、总结
1、导读
微信斗图的应用有很多,但大部分都是通过微信分享来实现的,需下载 APP,下载表情并分享到微信联系人,操作步骤复杂。而基于输入法的微信斗图就少了不少操作,现在市面上的输入法大都有斗图模块,然而有些强迫症患者,对第三方输入法的斗图模块设计并不满意,或者操作步骤依然复杂、有捆绑模块、不喜欢输入法有广告、需要读取隐私信息等各种原因,就是不想用不喜欢的第三方输入法,基于这个需求,可以把斗图模块单独抽出来,制作一个专注于斗图的输入法 APP。
通过分析市面上已有的输入法斗图模块可以得知微信的一个隐藏功能,就是在聊天输入框输入类似/storage/emulated/0/Android/data/cache/a.gif
的图片文件路径时,微信会自动解析图片,并弹出是否发送表情的确认弹窗,点击确认就直接发送了图片,如果是 gif 动图则直接转换成表情。所以我们只需在输入法面板中通过关键字搜索表情后展示表情列表,直接点击表情上屏图片路径,即可实现自动发送。那么问题的关键就在于如何构建一个输入法项目,最后为了操作更方便,可以使用辅助功能提升用户体验。
2、输入法开发
1.API简介
简单来说,开发一个输入法,只需要用到一个核心类和几个可有可无的辅助类。
核心类是InputMethodService
,一个输入法几乎所有的功能都是由它来实现的,包括键盘界面的搭建、键盘语言的切换、拼音汉字的转换、候选词的展示、文字的上屏等各种逻辑都通过这个类来实现。InputMethodService
类有如下几个主要方法来管理输入法服务的生命周期:
-
onCreate():输入法开始创建,内部已经实现设置 theme、创建 window、填充 root view、设置布局方式等,我们也可以在此处做一些初始化操作,但一定不要忘了调用 supper.onCreate();
-
onCreateInputView():返回一个 view 作为输入法的键盘布局,通常这个view 是由KeyboardView 和 Keyboard 两个辅助类生成,当然也完全可以自定义。切换一次输入法只会调用一次;
-
onCreateCandidatesView(): 返回一个 view 来展示候选词,这个 view 可有可无,会覆盖到应用上方,一般用半透明的背景,但市面上的输入法一般都用来显示拼音部分,而把候选词放入 InputView。同样切换一次输入法只会调用一次;
-
onStartInputView(EditorInfo): 开始输入的时候调用,每次唤起键盘或切换 EditText 都会调用,并把 EditText 的 EditorInfo 传过来,输入法要根据 EditorInfo 的信息判断中英文、数字、回车键类型等,来展示不同的键盘,也就是动态切换 InputView 的布局;
-
onFinishInput(): 输入结束的时候调用,此时可以做一些 reset 操作,比如隐藏 CandidatesView,恢复 InputView 为默认布局等;
-
onDestroy(): 一般在切换其他输入法的时候会被调用,实测输入法不用一段时间,系统也会暂时杀掉进程,此时也会被调用。
可能有同学对上面提到的InputView
和CandidatesView
到底是什么还有些疑问,下面这张图可以表达地很清楚:
而这些方法定义的生命周期则可以通过Android Developers官方的一张图来深入理解,相信每篇输入法相关的文章都会有这张经典的图:
在InputMethodService
中,负责与正在输入的APP交互的是其持有的InputConnection
对象,可通过getCurrentInputConnection()
方法获取,InputConnection
有如下几个常用的方法:
-
getTextBeforeCursor(n): 获取光标前 n 个字符;
-
getTextAfterCursor(n): 获取光标后 n 个字符;
-
getSelectedText(): 获取已经被选中的字符;
-
deleteSurroundingText(beforeLength, afterLength): 删除光标前后的字符;
-
commitText(text): 提交 text 到 APP 的输入框;
-
sendKeyEvent(keyEvent): 发送特殊的按键 code,如回车、退格等。
再说说上文中提到的两个辅助类KeyboardView
和Keyboard
,已经提到,InputView
可以是一个KeyboardView
,KeyboardView
内部已经封装了一些键盘的通用功能,比如特殊按键(回车、退格等)的发送、滑动手势功能、长按键盘功能、按键音的播放等等。而KeyboardView
只是一个空的view它的布局是没有确定的,查找它的代码我们发现其中有一个成员Keyboard
,这就是另外一个辅助类,Keyboard
的主要任务就是承载特定的键盘布局,如中英文键盘、数字键盘、符号键盘等