各键对应的编码
绘制步骤
1、写keyboard的xml文件
<?xml version="1.0" encoding="utf-8"?> <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:horizontalGap="12dp" android:verticalGap="14dp" android:keyWidth="33.33333%p" android:keyHeight="8%p"> <Row> <Key android:codes="49" android:keyLabel="1"></Key> <Key android:codes="50" android:keyLabel="2"></Key> <Key android:codes="51" android:keyLabel="3"></Key> <Key android:codes="52" android:keyLabel="4"></Key> <Key android:codes="53" android:keyLabel="5"></Key> </Row> <Row> <Key android:codes="54" android:keyLabel="6"></Key> <Key android:codes="55" android:keyLabel="7"></Key> <Key android:codes="56" android:keyLabel="8"></Key> <Key android:codes="57" android:keyLabel="9"></Key> <Key android:codes="48" android:keyLabel="0"></Key> </Row> <Row> <Key android:codes="43" android:keyLabel="+"></Key> <Key android:codes="45" android:keyLabel="-"></Key> <Key android:codes="46" android:keyLabel="."></Key> <!--KEYCODE_CANCEL--> <Key android:codes="-3" android:keyLabel="C"></Key> <!--KEYCODE_DELETE--> <Key android:codes="-5" android:isRepeatable="false" android:keyIcon="@drawable/ic_calculator_delete"/> </Row> </Keyboard>
2、重写 KeyboardView
public class NumKeyView extends KeyboardView implements KeyboardView.OnKeyboardActionListener { //用于区分左下角空白按键,(要与xml里设置的数值相同) private int KEYCODE_EMPTY = -10; private Drawable mDeleteKeyDrawable; //删除按键背景图片 private int mKryboardBackgroud; private Drawable mKryDrawable; //按键背景 private int mPaddingLeft; private int mPaddingRight; private int mPaddingTop; private int mPaddingBottom; public NumKeyView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public NumKeyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr); } private void init(Context context, AttributeSet attrs, int defStyleAttr) { TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.NumKeyView); mKryDrawable = ta.getDrawable(R.styleable.NumKeyView_keyBackgBackground); mDeleteKeyDrawable = ta.getDrawable(R.styleable.NumKeyView_deleteDrawable); //删除按键颜色 mKryboardBackgroud = ta.getColor(R.styleable.NumKeyView_keyboardBackgBackground, Color.WHITE); //keyboard背景颜色 mPaddingLeft = (int) ta.getDimension(R.styleable.NumKeyView_leftPadding, 0); mPaddingRight = (int) ta.getDimension(R.styleable.NumKeyView_rightPadding, 0); mPaddingTop = (int) ta.getDimension(R.styleable.NumKeyView_topPadding, 0); mPaddingBottom = (int) ta.getDimension(R.styleable.NumKeyView_bottomPadding, 0); ta.recycle(); //获取xml中的按键布局 Keyboard keyboard = new Keyboard(context, R.xml.numkeyview); setKeyboard(keyboard); setEnabled(true); setPreviewEnabled(false); setOnKeyboardActionListener(this); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(mKryboardBackgroud); drawKeyboardBorder(canvas); Keyboard keyboard = getKeyboard(); if (keyboard == null) return; List<Keyboard.Key> keys = keyboard.getKeys(); if (keys != null && keys.size() > 0) { Paint paint = new Paint(); paint.setTextAlign(Paint.Align.CENTER); Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD); paint.setTypeface(font); paint.setAntiAlias(true); for (Keyboard.Key key : keys) { if (key.codes[0] == Keyboard.KEYCODE_DELETE) { //绘制删除键背景 drawKeyBackGround(key, canvas); //绘制按键图片 drawkeyDelete(key, canvas); } else { drawKeyBackGround(key, canvas); } if (key.label != null) { if (key.codes[0] == Keyboard.KEYCODE_DELETE) { } else { paint.setColor(getContext().getResources().getColor(R.color.c000000)); paint.setTextSize(sp2px(25)); } Rect rect = new Rect(key.x, key.y, key.x + key.width, key.y + key.height); Paint.FontMetricsInt fontMetrics = paint.getFontMetricsInt(); int baseline = (rect.bottom + rect.top - fontMetrics.bottom - fontMetrics.top) / 2; // 下面这行是实现水平居中,drawText对应改为传入targetRect.centerX() paint.setTextAlign(Paint.Align.CENTER); canvas.drawText(key.label.toString(), rect.centerX(), baseline, paint); } } } } //绘制边框 private void drawKeyboardBorder(Canvas canvas) { } //数字键 private void drawKeyBackGround(Keyboard.Key key, Canvas canvas) { mKryDrawable.setBounds(key.x, key.y, key.x + key.width, key.y + key.height); mKryDrawable.draw(canvas); } //删除键 private void drawkeyDelete(Keyboard.Key key, Canvas canvas) { int drawWidth = key.width; int drawHeight = key.height; drawWidth = drawWidth / 2; drawHeight = drawHeight / 2; int widthInterval = (key.width - drawWidth) / 2; int heightInterval = (key.height - drawHeight) / 2; mDeleteKeyDrawable.setBounds(key.x + widthInterval, key.y + heightInterval, key.x + widthInterval + drawWidth, key.y + heightInterval + drawHeight); mDeleteKeyDrawable.draw(canvas); } //回调接口 public interface OnKeyPressListener { //添加数据回调 void onInertKey(String text); //删除数据回调 void onDeleteKey(); void onClearKey(); } private OnKeyPressListener mOnkeyPressListener; public void setOnKeyPressListener(OnKeyPressListener li) { mOnkeyPressListener = li; } @Override public void onKey(int i, int[] ints) { if (i == Keyboard.KEYCODE_DELETE && mOnkeyPressListener != null) { //删除数据回调 mOnkeyPressListener.onDeleteKey(); } else if (i == Keyboard.KEYCODE_CANCEL && mOnkeyPressListener != null) { //清除数据 mOnkeyPressListener.onClearKey(); } else if (i != KEYCODE_EMPTY) { //添加数据回调 mOnkeyPressListener.onInertKey(Character.toString((char) i)); } } @Override public void onPress(int i) { } @Override public void onRelease(int i) { } @Override public void onText(CharSequence charSequence) { } @Override public void swipeRight() { super.swipeRight(); } @Override public void swipeDown() { super.swipeDown(); } @Override public void swipeLeft() { super.swipeLeft(); } @Override public void swipeUp() { super.swipeUp(); } /*****************************************************************/ private int sp2px(float spValue) { final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } }
3、Activity 中实现
public class MainActivity extends AppCompatActivity { private EditText mEditText; private NumKeyView mKeyView; private LinearLayout mLinearlayout; private PopupWindow mPop; private View mPopView; private RelativeLayout mRelativeLayout; private Handler mhandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); mPop.dismiss(); mKeyView.setVisibility(View.VISIBLE); ; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); mEditText = findViewById(R.id.et); mLinearlayout = findViewById(R.id.ln); mPop = new PopupWindow(); mPopView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.keyboard_pop, null); mPop.setContentView(mPopView); mPop.setTouchable(true); mPop.setFocusable(true); mPop.setBackgroundDrawable(new ColorDrawable()); mPop.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); mPop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mPop.setAnimationStyle(R.style.PopWindowstyle); mKeyView = mPopView.findViewById(R.id.keyboardview); mRelativeLayout = mPopView.findViewById(R.id.iv_hide); mRelativeLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mPop.dismiss(); } }); mEditText.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int inputType = mEditText.getInputType(); mEditText.setInputType(InputType.TYPE_NULL);// 让系统键盘不弹出 //点击按钮显示键盘 mPop.showAtLocation(mLinearlayout, Gravity.BOTTOM, 0, 0); mEditText.setInputType(inputType); //设定光标位置 Selection.setSelection(mEditText.getText(), mEditText.getText().length()); return false; } }); //设置回调,并进行文本的插入与删除 mKeyView.setOnKeyPressListener(new NumKeyView.OnKeyPressListener() { @Override public void onInertKey(String text) { mEditText.append(text); } @Override public void onDeleteKey() { int last = mEditText.getText().length(); if (last > 0) { //删除最后一位 mEditText.getText().delete(last - 1, last); } } @Override public void onClearKey() { mEditText.getText().clear(); } }); } }
5、keyboard_pop.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/c00000000" android:orientation="vertical"> <RelativeLayout android:id="@+id/iv_hide" android:layout_width="80dp" android:layout_height="44dp" android:layout_alignParentRight="true" android:layout_marginRight="8dp" android:background="@color/cE7EDF5"> <ImageView android:layout_width="36dp" android:layout_height="36dp" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/ic_calculator_up" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/iv_hide" android:background="@color/cCDCDCD"> <com.example.guojin.keyboarddemo.NumKeyView android:id="@+id/keyboardview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="17dp" android:layout_marginTop="18dp" android:layout_marginRight="17dp" android:layout_marginBottom="20dp" android:focusable="true" android:focusableInTouchMode="true" app:bottomPadding="20dp" app:deleteDrawable="@drawable/ic_calculator_delete" app:keyBackgBackground="@drawable/key_bg_view" app:keyboardBackgBackground="@color/cCDCDCD" /> </LinearLayout> </RelativeLayout>
style文件
//键盘属性 <declare-styleable name="NumKeyView"> <attr name="keyboardBackgBackground" format="color|reference"></attr> <attr name="keyBackgBackground" format="color|reference"></attr> <attr name="deleteDrawable" format="reference"></attr> <attr name="leftPadding" format="dimension"></attr> <attr name="rightPadding" format="dimension"></attr> <attr name="topPadding" format="dimension"></attr> <attr name="bottomPadding" format="dimension"></attr> </declare-styleable>
作者:涛涛123759
链接:https://www.jianshu.com/p/b899b8eb3055