1 在res下新建xml文件夹,有的话就略过,在xml新建类似keyboard.xml文件,内容如下:
2 在values文件夹下新建 custom_keyboard.xml 内容如下:
-10000 -10001 -10002 -10003
3 在activity布局文件中,添加如下代码 示例:
4 添加工具类:
package com.czb.czbsumiost1.utils;import android.content.Context;import android.inputmethodservice.Keyboard;import android.inputmethodservice.KeyboardView;import android.text.Editable;import android.text.TextUtils;import android.util.Log;import android.widget.EditText;import com.czb.czbsumiost1.MyAppLication;import com.czb.czbsumiost1.R;import com.czb.czbsumiost1.utils.eventbus.Event;import com.czb.czbsumiost1.utils.eventbus.EventBusUtil;/** * Created by czb365 on 2017/11/16. */public class KeyUtils { private Context mContext; private KeyboardView mKeyboardView; private Keyboard mKeyboard; private EditText etCurrent; public KeyUtils(Context context, KeyboardView keyboardView, EditText editText) { mContext = context; this.etCurrent = editText; //初始化键盘布局,下面在放进 KeyBoardView里面去。 mKeyboard = new Keyboard(mContext, R.xml.keyboard); //配置keyBoardView try { mKeyboardView = keyboardView; mKeyboardView.setKeyboard(mKeyboard); mKeyboardView.setPreviewEnabled(false); //按住键盘出来的预览图。 mKeyboardView.setOnKeyboardActionListener(mListener); } catch (Exception e) { Log.e("sun", "keyview初始化失败" + e.getMessage()); } } //监听 private KeyboardView.OnKeyboardActionListener mListener = new KeyboardView.OnKeyboardActionListener() { @Override public void onPress(int primaryCode) {// Log.e("sun", "onPress=======:" + primaryCode); } @Override public void onRelease(int primaryCode) {// Log.e("sun", "onRelease====:" + primaryCode); } @Override public void onKey(int primaryCode, int[] keyCodes) {// Log.e("sun", "onkey=====primaryCode:" + primaryCode + ""); if (null == etCurrent) return; if (!etCurrent.hasFocus()) { MyAppLication.requestFocus(etCurrent); EventBusUtil.sendEvent(new Event(C.EventCode.HIDE_KEYBOARD)); } Editable editable = etCurrent.getText(); int start = etCurrent.getSelectionStart(); if (primaryCode == Keyboard.KEYCODE_DELETE) { //回退 if (!TextUtils.isEmpty(editable)) { if (start > 0) { editable.delete(start - 1, start); } } } else if (primaryCode == getKeyCode(R.integer.keycode_empty_text)) { //清空 editable.clear(); } else if (primaryCode == 46) { //小数点// if (!editable.toString().contains(".")) {// editable.insert(start, Character.toString((char) primaryCode));// } } else if (primaryCode == getKeyCode(R.integer.keycode_00)) { //00 editable.insert(start, "00"); } else if (primaryCode == getKeyCode(R.integer.keycode_confirm)) { //确定 EventBusUtil.sendEvent(new Event(C.EventCode.CONFIRM_SCAN_CODE, editable)); } else { //其他默认 editable.insert(start, Character.toString((char) primaryCode)); } } @Override public void onText(CharSequence charSequence) { } @Override public void swipeLeft() {// Log.e("sun", "swipeLeft"); } @Override public void swipeRight() {// Log.e("sun", "swipeRight"); } @Override public void swipeDown() {// Log.e("sun", "swipeDown"); } @Override public void swipeUp() {// Log.e("sun", "swipeUp"); } }; protected int getKeyCode(int resId) { if (null != etCurrent) { return etCurrent.getContext().getResources().getInteger(resId); } else { return Integer.MIN_VALUE; } }}
5 在activity中使用
new KeyUtils(getActivity(), binding.mainKeyview, binding.codeInput);
6.改变某个按钮背景色或文字颜色:
import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Typeface;import android.graphics.drawable.Drawable;import android.inputmethodservice.Keyboard;import android.inputmethodservice.Keyboard.Key;import android.inputmethodservice.KeyboardView;import android.util.AttributeSet;import java.lang.reflect.Field;import java.util.List;public class MyKeyBoardView extends KeyboardView { private Context mContext; private Keyboard mKeyBoard; public MyKeyBoardView(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; } public MyKeyBoardView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.mContext = context; } /** * 重新画一些按键 */ @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); mKeyBoard = this.getKeyboard(); Listkeys = null; if (mKeyBoard != null) { keys = mKeyBoard.getKeys(); } if (keys != null) { for (Key key : keys) { // 数字键盘的处理 if (key.codes[0] == -4) { drawKeyBackground(R.drawable.bg_keyboardview_yes, canvas, key); drawText(canvas, key); } } } } private void drawKeyBackground(int drawableId, Canvas canvas, Key key) { Drawable npd = mContext.getResources().getDrawable( drawableId); int[] drawableState = key.getCurrentDrawableState(); if (key.codes[0] != 0) { npd.setState(drawableState); } npd.setBounds(key.x, key.y, key.x + key.width, key.y + key.height); npd.draw(canvas); } private void drawText(Canvas canvas, Key key) { Rect bounds = new Rect(); Paint paint = new Paint(); paint.setTextAlign(Paint.Align.CENTER); paint.setAntiAlias(true); paint.setColor(Color.WHITE); if (key.label != null) { String label = key.label.toString(); Field field; if (label.length() > 1 && key.codes.length < 2) { int labelTextSize = 0; try { field = KeyboardView.class.getDeclaredField("mLabelTextSize"); field.setAccessible(true); labelTextSize = (int) field.get(this); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } paint.setTextSize(labelTextSize); paint.setTypeface(Typeface.DEFAULT_BOLD); } else { int keyTextSize = 0; try { field = KeyboardView.class.getDeclaredField("mLabelTextSize"); field.setAccessible(true); keyTextSize = (int) field.get(this); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } paint.setTextSize(keyTextSize); paint.setTypeface(Typeface.DEFAULT); } paint.getTextBounds(key.label.toString(), 0, key.label.toString() .length(), bounds); canvas.drawText(key.label.toString(), key.x + (key.width / 2), (key.y + key.height / 2) + bounds.height() / 2, paint); } else if (key.icon != null) { key.icon.setBounds(key.x + (key.width - key.icon.getIntrinsicWidth()) / 2, key.y + (key.height - key.icon.getIntrinsicHeight()) / 2, key.x + (key.width - key.icon.getIntrinsicWidth()) / 2 + key.icon.getIntrinsicWidth(), key.y + (key.height - key.icon.getIntrinsicHeight()) / 2 + key.icon.getIntrinsicHeight()); key.icon.draw(canvas); } }}