博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 自定义系统键盘
阅读量:7034 次
发布时间:2019-06-28

本文共 8624 字,大约阅读时间需要 28 分钟。

hot3.png

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();        List
keys = 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); } }}

 

 

转载于:https://my.oschina.net/u/1268043/blog/1607896

你可能感兴趣的文章
Java基础学习总结(13)——流IO
查看>>
Maven学习总结(三)——使用Maven构建项目
查看>>
Tomcat在Linux上的安装与配置
查看>>
CentOS 6和CentOS 7命令区别
查看>>
OUTLOOK2007 即时搜索失效解决经过
查看>>
SVN学习总结(2)——SVN冲突解决
查看>>
Maven学习总结(四)——Maven核心概念
查看>>
安装xtables-addons时报错
查看>>
.NET开发规范教程
查看>>
网络公开课《最后的升级-Oracle RAC数据库升级》
查看>>
配置FTP服务
查看>>
我的友情链接
查看>>
人类认识的层次模型
查看>>
WDS使用捕获映像制作企业自定义映像
查看>>
C++数组、指针与vector、iterator
查看>>
SSL及其开源实现OpenSSL+创建私有CA
查看>>
jquery实现表单form异步提交
查看>>
Citrix xendesktop中未注册(Not registered)的检查流程
查看>>
一张图让你看懂JAVA线程间的状态转换
查看>>
Performance comparison Raw device VS Ext2 VS Ext3 VS OCFS
查看>>