各键对应的编码
绘制步骤
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>
网友评论