Android自定义键盘的实现(数字键盘和字母键盘)

在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘。本文主要讲述数字键盘和字母键盘的自定义实现。

项目地址:https://github.com/xudjx/djkeyboard

键盘效果:

自定义键盘的实现步骤如下:

  1. 自定义CustomKeyboard, 继承自系统Keyboard,实现KeyboardView.OnKeyboardActionListener相关接口,以处理用户的点击回调;
  2. 自定义CustomKeyboardView, 继承自KeyboardView,实现自定义键盘绘制;
  3. 创建KeyboardManager, 用于处理自定义键盘的显示以及和输入UI的交互

自定义CustomKeyboard

Android系统Keyboard的构造方法如下:

 /**
   * Creates a keyboard from the given xml key layout file.
   * @param context the application or service context
   * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
   */
  public Keyboard(Context context, int xmlLayoutResId) {
    this(context, xmlLayoutResId, 0);
  }

  /**
   * Creates a keyboard from the given xml key layout file. Weeds out rows
   * that have a keyboard mode defined but don't match the specified mode.
   * @param context the application or service context
   * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
   * @param modeId keyboard mode identifier
   * @param width sets width of keyboard
   * @param height sets height of keyboard
   */
  public Keyboard(Context context, @XmlRes int xmlLayoutResId, int modeId, int width,
      int height) {
      ...
  }

其中,参数xmlLayoutResId是必须的,另外还可以通过计算系统键盘的高度来设定自定义键盘的高度。

xmlLayoutRes的格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<Keyboard android:keyWidth="24.9%p"
     android:keyHeight="49dp"
     android:horizontalGap="0.1333%p"
     android:verticalGap="1px"
     xmlns:android="http://schemas.android.com/apk/res/android">
  <Row>
    <Key android:codes="49" android:keyEdgeFlags="left"
       android:keyLabel="1" />
    <Key android:codes="50" android:keyLabel="2" />
    <Key android:codes="51" android:keyLabel="3" />
    <Key android:codes="-5" android:iconPreview="@drawable/key_num_del_bg"
       android:isRepeatable="true"/>
  </Row>
  ...
</Keyboard>

详细的数字键盘和字母键盘xmlLayoutRes资源文件可以从以下链接获取:
数字键盘xmlLayoutRes
字母键盘xmlLayoutRes

CustomKeyboard主要目的就是赋予xmlLayoutRes并实现特定按键的点击处理,其主要重载的方法是onKey(int primaryCode, int[] keyCodes)。详细代码如下:

public abstract class BaseKeyboard extends Keyboard implements KeyboardView.OnKeyboardActionListener{

 @Override
 public void onKey(int primaryCode, int[] keyCodes) {
    if(null != mEditText && mEditText.hasFocus() && !handleSpecialKey(primaryCode)) {
      Editable editable = mEditText.getText();
      int start = mEditText.getSelectionStart();
      int end = mEditText.getSelectionEnd();
      if (end > start){
        editable.delete(start,end);
      }
      if(primaryCode == KEYCODE_DELETE) {
        if(!TextUtils.isEmpty(editable)) {
          if(start > 0) {
            editable.delete(start-1,start);
          }
        }
      }else if(primaryCode == getKeyCode(R.integer.hide_keyboard)){
        hideKeyboard();
      }else {
        editable.insert(start,Character.toString((char) primaryCode));
      }
    }
  }

 public abstract boolean handleSpecialKey(int primaryCode);
}

如上所示是BaseKeyboard,数字键盘和字母键盘需要继承它,并实现public abstract boolean handleSpecialKey(int primaryCode)方法。

自定义CustomKeyboardView

KeyboardView 是承载不同的keyboard并绘制keyboard, 是键盘布局的绘制板, 并与系统交互。通过继承KeyboardView自定义CustomKeyboardView,可以对按键样式实现自定义。考察KeyboardView的源码,发现其UI样式都是private类型,这就需要通过反射的方式获取特定的UI属性,并重新进行赋值,同时重载onDraw()方法,在onDraw()中重新绘制。

详细代码可以参考github源码: BaseKeyBoardView源码

自定义键盘的UI效果如下:


数字键盘


字母键盘

创建KeyboardManager

主要处理以下功能逻辑:

  1. 绑定EditText和Keyboard,监听EditText的OnFocusChangeListener,处理键盘弹出和键盘掩藏;
  2. 处理系统键盘和自定义键盘之间的切换关系;
  3. 处理键盘区域其他自定义view的显示,比如需要让键盘自动搜索功能时,可在manager中进行相关处理

以绑定EditText为例:

public void bindToEditor(EditText editText, BaseKeyboard keyboard) {
  hideSystemSoftKeyboard(editText);
  editText.setTag(R.id.bind_keyboard_2_editor, keyboard);
  if (keyboard.getKeyStyle() == null) {
    keyboard.setKeyStyle(mDefaultKeyStyle);
  }
  editText.setOnFocusChangeListener(editorFocusChangeListener);
}

private final View.OnFocusChangeListener editorFocusChangeListener = new View.OnFocusChangeListener() {
  @Override
  public void onFocusChange(final View v, boolean hasFocus) {
    if (v instanceof EditText) {
      if (hasFocus) {
       v.postDelayed(new Runnable() {
          @Override
          public void run() {
            showSoftKeyboard((EditText) v);
          }
        },300);
      } else {
        hideSoftKeyboard();
      }
    }
  }
};

public void showSoftKeyboard(EditText editText) {
  mRootView.addOnLayoutChangeListener(mOnLayoutChangeListener);
  BaseKeyboard keyboard = getBindKeyboard(editText);
  if (keyboard == null) {
    Log.e(TAG, "edit text not bind to keyboard");
    return;
  }
  keyboard.setEditText(editText);
  keyboard.setNextFocusView(mKeyboardWithSearchView.getEditText());
  initKeyboard(keyboard);
  ...
}

键盘的使用方式非常简单, 通过KeyboardManager实现调用

数字键盘:

KeyboardManager keyboardManagerNumber = new KeyboardManager(this);
keyboardManagerNumber.bindToEditor(editText2, new NumberKeyboard(context,NumberKeyboard.DEFAULT_NUMBER_XML_LAYOUT));

字母键盘:

KeyboardManager keyboardManagerAbc = new KeyboardManager(this);
keyboardManagerAbc.bindToEditor(editText1, new ABCKeyboard(context, ABCKeyboard.DEFAULT_ABC_XML_LAYOUT));

至此,自定义键盘的实现就介绍完了,文中介绍的更多还是实现的思路,具体实现可以参考github,有需要的用户也可以直接修改项目的源码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android自定义密码输入框和数字键盘

    实现了一个自定义的密码输入框和自定义数字键盘,用作用户支付密码设置界面.先上效果图如下,方格样式,以及点击空白处隐藏软键盘. 控件实现清单: 1)集成于EditText的输入框控件:PasswordInputView.java 2)数字键盘工具类:NumKeyboardUtil.java 3)xml文件:number.xml 4)attrs样式 5)layout文件 具体内容: PasswordInputView.java public class PasswordInputView exten

  • Android开发之如何自定义数字键盘详解

    前言 这篇文章是介绍Android中自定义键盘的一些套路,通过定义一个数字键盘为例,本篇的文章语言是基于Kotlin实现的,如果还没有用或者不熟悉该语言的同学,可以自己补习,我之前也写过入门文章. 效果图 github:源码传送门 本地下载:源码传送门 加载键盘存储键属性的XML描述 我们下面的介绍都是依靠上图的实现来展开的,首先是软键盘的布局,我们需要我们的res/xml目录下创建一个xml文件,根节点就是Keyboard,然后就是键盘的每一行Row,每一行中可以指定每一列,也就是具体的键Ke

  • Android 仿微信自定义数字键盘的实现代码

    本文介绍了Android 仿微信自定义数字键盘的实现代码,分享给大家,希望对大家有帮助 最终效果: 实现这个自定义键盘的思路很简单: 要写出一个数字键盘的布局: 与 Edittext 结合使用,对每个按键的点击事件进行处理: 禁用系统软键盘. 有了思路,实现起来就不难了. 1. 实现键盘的 xml 布局 网格样式的布局用 GridView 或者 RecyclerView 都可以实现,其实用 GridView 更方便一些,不过我为了多熟悉 RecyclerView 的用法,这里选择用了 Recyc

  • Android自定义View实现带数字的进度条实例代码

    第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 第二步.自定义ProgressBar实现带数字的进度条 0.项目结构 如上图所示:library项目为自定义的带数字的进度条NumberProgressBar的具体实现,demo项目为示例项目以工程依赖的方式引用library项目,然后使用自定义的带数字的进度条NumberProgressBar来做展示 如上图所示:自定义的带数字的进度条的library项目的结构图 如上图所示:de

  • Android自定义SeekBar滑动显示数字

    先来上个效果图: 当滑动时:数值显示,滑动停止时显示数字,使用FrameLayout结合SeekBar. 首先我们看看. Layout: <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.c

  • Android自定义View实现黑客帝国数字雨效果

    0. 昨天又看了一遍黑客帝国,怎么说了,时隔多年,依旧那么经典,小时候看不懂,现在再看却有很多体味.小时候看时印象最深的就是数字雨了,导致我现在写代码也要是黑屏.所以今天上午,闲来无事,拿出两个小时写了一个数字雨控件,直接上图. 1. 先分析,再动笔.这里我将代码分为两部分,一个数字雨中的每一列NumberRainItem,还有就是所有列合并起来的NumberRain. NumberRain比较简单,就是继承自LinearLayout的一个控件,在计算出宽度后添加NumberRainItem,很

  • Android自定义圆弧进度条加数字动态变化

    本文实例为大家分享了Android自定义圆弧进度条数字变化的具体代码,供大家参考,具体内容如下 效果如下: 思路:一个内环圆弧和一个外环圆弧,因为有一个圆圈是在圆弧上做圆周运动,所以在画圆的时候必须要得到圆弧上的各个点的坐标,这里其实就用到了PathMeasure这个类,可以帮我们拿到这些点,在画圆弧的时候也理所应当的要使用path,然后根据外界动态的传值进行重绘就能达到动态的效果 代码如下: public class ProgressPathRainbow extends View { pri

  • Android自定义键盘的实现(数字键盘和字母键盘)

    在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 项目地址:https://github.com/xudjx/djkeyboard 键盘效果: 自定义键盘的实现步骤如下: 自定义CustomKeyboard, 继承自系统Keyboard,实现KeyboardView.OnKeyboardActionListener相关接口,以处理用户的点击回调: 自定义CustomKeyboardView, 继承自Key

  • Android 高仿微信支付数字键盘功能

    现在很多app的支付.输入密码功能,都已经开始使用自定义数字键盘,不仅更加方便.其效果着实精致. 下面带着大家学习下,如何高仿微信的数字键盘,可以拿来直接用在自身的项目中. 先看下效果图: 1. 自定义布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  • Android 自定义输入支付密码的软键盘实例代码

    Android 自定义输入支付密码的软键盘 有项目需求需要做一个密码锁功能,还有自己的软键盘,类似与支付宝那种,这里是整理的资料,大家可以看下,如有错误,欢迎留言指正 需求:要实现类似支付宝的输入支付密码的功能,效果图如下: 软键盘效果图 使用 android.inputmethodservice.KeyboardView 这个类自定义软键盘 软键盘的实现 1. 自定义只输入数字的软键盘 PasswordKeyboardView 类,继承自 android.inputmethodservice.

  • Android自定义软键盘的设计与实现代码

    偶然间发现了Android.inputmethodservice.Keyboard类,即android可以自定义键盘类,做了一个简单例子供大家参考. 效果如下: 先看界面布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout

  • Android自定义输入法软键盘

    本文实例为大家分享了Android自定义输入法软键盘的具体代码,供大家参考,具体内容如下 1 功能描述 触屏设备主界面中有一个文本编辑框,底部区域固定显示一个数字键盘,键盘中除数字键外,还带有*和#键功能: 提供一个自定义的数字输入法,生成apk安装包文件,嵌入到img镜像文件中去. 2 设计实现 1.创建类名为SimpleIME,继承父类InputMethodService,实现KeyboardView.OnKeyboardActionListener接口. 2.编写键盘对象加载的.xml文件

  • Android自定义软键盘的步骤记录

    目录 效果图 实现自定义软键盘 1.通过xml定义键盘 2.将xml文件与keyboardview绑定起来 3.处理点击事件onKey 附赠一些实用的效果处理 总结 效果图 还是咱们的老规矩,先放最终效果图

随机推荐