各键对应的编码

绘制步骤
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
随时随地看视频