前言
这篇文章是介绍Android中自定义键盘的一些套路,通过定义一个数字键盘为例,本篇的文章语言是基于Kotlin实现的,如果还没有用或者不熟悉该语言的同学,可以自己补习,我之前也写过入门文章。
效果图
github:源码传送门
本地下载:源码传送门
加载键盘存储键属性的XML描述
我们下面的介绍都是依靠上图的实现来展开的,首先是软键盘的布局,我们需要我们的res/xml目录下创建一个xml文件,根节点就是Keyboard,然后就是键盘的每一行Row,每一行中可以指定每一列,也就是具体的键Key,代码实现
android:horizontalGap="1px"
android:keyHeight="7%p"
android:keyWidth="33.33%p"
android:verticalGap="1px">
android:codes="-4"
android:keyIcon="@drawable/hidden"
android:keyWidth="100%" />
android:codes="49"
android:keyLabel="1" />
android:codes="50"
android:keyLabel="2" />
android:codes="51"
android:keyLabel="3" />
android:codes="52"
android:keyLabel="4" />
android:codes="53"
android:keyLabel="5" />
android:codes="54"
android:keyLabel="6" />
android:codes="55"
android:keyLabel="7" />
android:codes="56"
android:keyLabel="8" />
android:codes="57"
android:keyLabel="9" />
android:codes="46"
android:keyLabel="." />
android:codes="48"
android:keyLabel="0" />
android:codes="-5"
android:isRepeatable="true"
android:keyIcon="@drawable/delete" />
在Keyboard节点属性中,我们通过horizontalGap设置水平的间距,通过verticalGap设置垂直的间距,通过keyWidth设置每一个key的宽度,通过keyHeight设置。需要注意的地点是如果Keyboard ,Row和Key都可以指定宽高。通常我们可以指定在Keyboard 中设置每一个键的宽高就可以了。当然如果对特定行的宽高要有所调整,可以在Row 或者key上设置,例如我们示例图中展示的最上面的一行,它的宽度比其它行都低了一点,则我们在第一行设置了属性android:keyHeight="6%p"
在每一个key中有下面常用属性
1、android:codes 官网介绍是说这个是该键的unicode 值或者逗号分隔值,当然我们也可以设置成我们想要的值,在源码中提供了几个特定的值
//就不解释了,通过名字应该看得出来
public static final int KEYCODE_SHIFT = -1;
public static final int KEYCODE_MODE_CHANGE = -2;
public static final int KEYCODE_CANCEL = -3;
public static final int KEYCODE_DONE = -4;
public static final int KEYCODE_DELETE = -5;
public static final int KEYCODE_ALT = -6;
2、android:keyOutputText 设置该值后,当点击key时回调onText(text: CharSequence?)会执行,参数就是我们设置的值。
3、android:keyIcon设置key上显示的icon
4、android:keyLabel键上显示的值
5、android:isRepeatable 当长按时是否重复该键设置的操作,例如我们删除键可以设置此属性。
6、android:keyEdgeFlags该属性有两个值,分别是left,right,用与指定显示在最左还是最右,一般不用此属性。默认从左到右排列。
还有其它属性,不在介绍,可以自己去查阅api
自定义KeyboardView
该类是用来渲染虚拟键盘的类,类中有一个接口OnKeyboardActionListener能检测按键和触摸动作,我们要自定义虚拟键盘,只需要继承该类并实现该监听接口即可,当然我这里并没有实现接口,我单独创建了一个工具类,用于将自定义键盘View和EditText关联,并设置接口监听,这些稍后介绍到再说,我们最主要关注的就是onDraw方法,它可以让我们自定义键盘的绘制,随心所欲的画我们想要的东西。当然,我们也可以不做任何实现,它默认的有一种绘制。
class CustomKeyboardView : KeyboardView {
private var mKeyBoard: Keyboard? = null
constructor(context: Context, attrs: AttributeSet) : this(context, attrs,0) {}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
//
}</