前言
之前一段时间,公司开始研发一款炒股软件。
如今,项目已经上线有段时间了。现在就将其中的一个功能—“股票键盘”拿出来给大家献献丑。
不说了,先上效果图:
技术点
说到股票软件,股票界的泰山北斗自然是“同花顺”了。小编设计研发的股票键盘也是向“同花顺”靠齐了。
该股票键盘的技术点主要有如下几点:
- 屏蔽系统键盘
- 自定义键盘
- 键盘显示方式
- 系统底部功能按钮适配
只要理清楚了这几点,那对功能的实现是起到事半功倍的效果。
接下来就从代码实现来给大家讲解一下。
股票键盘的实现
股票键盘的功能实现最主要的按钮是使用了系统提供的控件:KeyboardView
和Keyboard
。
KeyboardView
:keyboard的容器,KeyboardView.setKeyboard()切换显示的键盘
Keyboard
:键盘的具体显示
设计键盘布局
键盘的布局通过xml文件方式定义。
由Keyboard
、Row
、Key
组成。
Keyboard
:Keyboard控件的根布局,用以控制按钮行、列间距,按钮Key
的宽高。
属性 | 介绍 |
---|---|
android:horizontalGap | Default horizontal gap between keys. |
android:keyHeight | Default height of a key, in pixels or percentage of display width. |
android:keyWidth | Default width of a key, in pixels or percentage of display width. |
android:verticalGap | Default vertical gap between rows of keys. |
Row
:行,Key
的容器
属性 | 介绍 |
---|---|
android:horizontalGap | Default horizontal gap between keys. |
android:keyHeight | Default height of a key, in pixels or percentage of display width. |
android:keyWidth | Default width of a key, in pixels or percentage of display width. |
android:keyboardMode | Mode of the keyboard. |
android:rowEdgeFlags | Row edge flags. |
android:verticalGap | Default vertical gap between rows of keys. |
Key
:按钮,设置按钮的属性,最常用的有- codes:OnKeyboardActionListener.onKey()中第一个参数为该值,用以区分按钮
- keyLabel:按钮显示的内容
- isRepeatable:按钮长按是否可重复发起回调
- keyIcon:按钮显示的图标
- keyEdgeFlags:按钮边的标志,
left
或right
属性 | 介绍 |
---|---|
android:codes | The unicode value or comma-separated values that this key outputs. |
android:horizontalGap | Default horizontal gap between keys. |
android:iconPreview | The icon to show in the popup preview. |
android:isModifier | Whether this is a modifier key such as Alt or Shift. |
android:isRepeatable | Whether long-pressing on this key will make it repeat. |
android:isSticky | Whether this is a toggle key. |
android:keyEdgeFlags | Key edge flags. |
android:keyHeight | Default height of a key, in pixels or percentage of display width. |
android:keyIcon | The icon to display on the key instead of the label. |
android:keyLabel | The label to display on the key. |
android:keyOutputText | The string of characters to output when this key is pressed. |
android:keyWidth | Default width of a key, in pixels or percentage of display width. |
android:popupCharacters | The characters to display in the popup keyboard. |
android:popupKeyboard | The XML keyboard layout of any popup keyboard. |
数字键盘
keyboard_stock_num.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
字母键盘
keyboard_stock_letter.xml
1 | <?xml version="1.0" encoding="UTF-8"?><!-- 全键盘带数字小键盘 --> |
隐藏系统键盘
1 | /** |
- Android H(11)之前设置
EditText.setInputType(InputType.TYPE_NULL);
屏蔽系统键盘 - Android H(11)~Android L(21)通过反射设置
setShowSoftInputOnFocus
为false
- Android L(21)以及之后 直接设置
EditText.setShowSoftInputOnFocus(true)
初始化
1 | public StockKeyboardUtil(Activity mActivity) { |
NavigationBarUtils
1 | /** |
初始化
两个Keyboard
:keyboardMum、keyboardLetter;
色值:灰、红;
系统底部虚拟按钮:hasNav-是否有,navHight-高度
NavigationBarUtils为NavigationBar的工具类,用以判断是否有NavigationBar(系统底部虚拟按钮),获取NavigationBar的高度。
绑定EditText
1 | /** |
初始化 完成后调用attachTo()
,绑定传入的EditText
。
内部hideSystemSofeKeyboard()
隐藏系统键盘,setAutoShowOnFocs()
设置焦点改变监听,用以控制本股票键盘的隐藏/显示。
股票键盘的隐藏/显示见下章节。
股票键盘显示/隐藏
1 | /** |
down_to_up.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
如果是首次显示,则初始化各种按钮和keyboardView
,并给keyboardView
注册监听,用以获取股票键盘的按钮回调。
frameLayout
为当前Activity
的DecorView
,直接将本股票布局填到该frameLayout
上进行显示。并添加了一个从底部向上移动的View动画。
按钮数据处理
1 | /** |
根据传入的primaryCode
进行判断处理。
primaryCode
为设计键盘布局中数字键盘或字母键盘中Key
中的android:codes
属性值。通过该值来判断当前点击的是哪个键盘按钮。
该值必须唯一。
editable.insert()
:primaryCode
转成char
类型后再调用Character.toString()
转成字符串插入editable中。因为int
和char
是可以互转的。两者间的关系可查询ASCII表
changeKeyboard()用以切换当前显示的键盘,总共有3种,这在下章节中介绍。
切换键盘
1 | /** |
SoftKeyboardUtil1
2
3
4
5
6
7
8
9 public static void showSoftKeyboard(Context context, View view) {
if (view.requestFocus()) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
// imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
数字键盘和字母键盘的切换主要是调用 KeyboardView.setKeyboard()
方法进行切换。
中文键盘设置比较复杂:
- 先隐藏当前股票键盘
- 再将之前屏蔽掉的系统键盘属性还原
- 显示系统键盘
- 延迟250毫秒后重新将系统键盘屏蔽掉,是为了下次显示股票键盘做准备
完整代码
所涉及到的其他代码这里就不再陈述了,上面的介绍中都有涉及到。
演示示例之后抽空补上。
1 | /** |