Android 自定义键盘

对于许久不用的东西,容易忘记。百度许久,也未能找到自己所要。 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧!

  • 系统弹窗
  • 键盘布局
  • 回调
  • 后续完善

许多应用都使用自定义的键盘,我自己也来撸一把,我等了三年,我不是证明我自己有多厉害,只是使用自己定义的键盘方便一些(嘿嘿)。 想想,你平时输入很多东西,要按很多按键,现在一个按键就搞定了。

比如:yancyang
需要一个字母一个字母的输入,现在把一个按键的输入直接变成yancyang,点击就变成yancyang,嗯嗯,爽快。

  • Window弹窗
    private void createView() {
        this.keyContainer = LayoutInflater.from(context).inflate(R.layout.layout_keyboard_containor, null);
        windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
        layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_TOAST,
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSPARENT);
        layoutParams.gravity = Gravity.CENTER_VERTICAL | Gravity.BOTTOM;
        windowManager.addView(keyContainer, layoutParams);
    }

属性:
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL:
即使在该window在可获得焦点情况下,仍然把该window之外的任何event发送到该window之后的其他window.

  • 键盘布局
    首先需要用到Keyboard类,官网是关于Keyboard的描述:

A view that renders a virtual {@link Keyboard}. It handles rendering of keys and
detecting key presses and touch movements.
Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard consists of rows of keys.The layout file for
a keyboard contains XML that looks like the following snippet:
翻译:
呈现虚拟{@link Keyboard}的视图。 它处理键的渲染和
检测按键和触摸动作
Keyboard显示的按钮通过xml来配置

keyboard_ff.xml <F1~F12按键布局,其他布局在完整Demo中>

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
          android:horizontalGap="1%p"
          android:keyWidth="23.5%p"
          android:keyHeight="@dimen/key_num_height"
          android:verticalGap="@dimen/key_vertical_gap">

    <Row>
        <Key
            android:codes="-101"
            android:keyLabel="F1"/>
        <Key
            android:codes="-102"
            android:keyLabel="F2"/>
        <Key
            android:codes="-103"
            android:keyLabel="F3"/>
        <Key
            android:codes="-104"
            android:keyLabel="F4"
            />
    </Row>

    <Row>
        <Key
            android:codes="-105"
            android:keyLabel="F5"/>
        <Key
            android:codes="-106"
            android:keyLabel="F6"/>
        <Key
            android:codes="-107"
            android:keyLabel="F7"/>

        <Key
            android:codes="-108"
            android:keyLabel="F8"
            />
    </Row>

    <Row>
        <Key
            android:codes="-109"
            android:keyLabel="F9"/>
        <Key
            android:codes="-110"
            android:keyLabel="F10"/>
        <Key
            android:codes="-111"
            android:keyLabel="F11"/>
        <Key
            android:codes="-112"
            android:keyLabel="F12"
            />
    </Row>

    <Row>
        <Key
            android:codes="-2"
            android:keyLabel="|⇆|"/>

        <Key
            android:codes="-113"
            android:keyLabel="En"/>
        <Key
            android:codes="-114"
            android:keyLabel="123"/>

        <Key
            android:codes="-1"
            android:keyLabel="↵"
            />
    </Row>
</Keyboard>

题外话:关于自定义按键,只需要继承KeyboardView,在OnDraw()中自己绘制即可,这里就不多赘述了。

  • 回调

keyboardView有一个监听按键的回调。
KeyboardView.OnKeyboardActionListener

  private KeyboardView.OnKeyboardActionListener listener = new KeyboardView.OnKeyboardActionListener() {
        @Override
        public void onPress(int primaryCode) {
        	//设置pop弹窗
            keyboardView.setPreviewEnabled(true);
        }

        @Override
        public void onRelease(int primaryCode) {
        }

        @Override
        public void onKey(int primaryCode, int[] keyCodes) {
        // primaryCode对应的为布局中设置的codes
        //Character.toString((char) primaryCode) 对应布局中的keyLabel
        }
     
        @Override
        public void onText(CharSequence text) {

        }

        @Override
        public void swipeLeft() {
        }

        @Override
        public void swipeRight() {
        }

        @Override
        public void swipeDown() {
        }

        @Override
        public void swipeUp() {
        }
    };

  • 后续完善《Demo中已经完善》

1.灭屏后,自定义键盘需要隐藏。
2.自动显示键盘、隐藏键盘
3.Windows弹窗监听返回键,并关闭键盘
4.不同edittext之间切换
5.输出值

注意项目中有两个回调,使用下面的方法即可(其他的回调,只是使用现在开发的项目)

 public void addAllEditTextListener(Context context, EditText... mEd) { }

使用中遇到什么问题,或者有更好的实现方法,欢迎留言!

完整Demo下载:https://download.csdn.net/download/weixin_39923324/10963351

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页