1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android 自定义软键盘实现 数字九宫格 Android常见面试题目

Android 自定义软键盘实现 数字九宫格 Android常见面试题目

时间:2022-08-17 17:32:05

相关推荐

Android 自定义软键盘实现 数字九宫格 Android常见面试题目

实现效果GIF

实现代码

自定义View 一个NineNumericKeyboardView

/**

Author by LyuDate on /5/26-19:55Description:九宫格数字软键盘

/

public class NineNumericKeyboardView extends View {

/*列

/

private static final int TOTAL_COL = 3;

/*行

*/

private static final int TOTAL_ROW = 4;

private Paint HuiseBgPaint, linePaint;

private Paint mTextPaint;

private int mViewWidth; // 键盘宽度

private int mViewHight; // 键盘高度

private float mCellWidth, mCellHight; // 单元格宽度、高度

private Row rows[] = new Row[TOTAL_ROW];

private Bitmap bitmap; // 删除按钮图片

private Paint mCutTextPaint;

//回调方法

public interface CallBack {

void clickNum(String num)

;// 回调点击的数字

void deleteNum();// 回调删除

}

private CallBack mCallBack;// 回调

public void setOnCallBack(CallBack callBack) {

mCallBack = callBack;

}

public NineNumericKeyboardView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

init(context);

}

public NineNumericKeyboardView(Context context, AttributeSet attrs) {

super(context, attrs);

init(context);

}

public NineNumericKeyboardView(Context context) {

super(context);

init(context);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

drawLine(canvas);

for (int i = 0; i < TOTAL_ROW; i++) {

if (rows[i] != null)

rows[i].drawCells(canvas);

}

}

/**

画6条直线@param canvas

*/

private void drawLine(Canvas canvas) {

canvas.drawLine(0, 0, mViewWidth, 0, linePaint);

canvas.drawLine(0, mCellHight, mViewWidth, mCellHight, linePaint);

canvas.drawLine(0, mCellHight * 2, mViewWidth, mCellHight * 2, linePaint);

canvas.drawLine(0, mCellHight * 3, mViewWidth, mCellHight * 3, linePaint);

canvas.drawLine(mCellWidth, 0, mCellWidth, mViewHight, linePaint);

canvas.drawLine(mCellWidth * 2, 0, mCellWidth * 2, mViewHight, linePaint);

}

/**

初始化画笔@param context

*/

private void init(Context context) {

mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mCutTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

linePaint.setTextSize(1.0f);

linePaint.setColor(0x90000000);

HuiseBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

HuiseBgPaint.setStyle(Paint.Style.FILL);

HuiseBgPaint.setColor(Color.parseColor("#e9e9e9"));

initDate();

}

private void initDate() {

fillDate();

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

mViewWidth = w;

mViewHight = h;

mCellWidth = mViewWidth / TOTAL_COL;

mCellHight = mViewHight / TOTAL_ROW;

mTextPaint.setTextSize(mCellHight / 3);

}

private Cell mClickCell = null;

private float mDownX;

private float mDownY;

/*

*

触摸事件为了确定点击位置的数字

*/

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

mDownX = event.getX();

mDownY = event.getY();

int col = (int) (mDownX / mCellWidth);

int row = (int) (mDownY / mCellHight);

measureClickCell(col, row);

break;

case MotionEvent.ACTION_UP:

if (mClickCell != null) {

// 在抬起后把状态置为默认

rows[mClickCell.i].cells[mClickCell.j].state = State.DEFAULT_NUM;

mClickCell = null;

invalidate();

}

break;

}

return true;

}

/**

测量点击单元格@param col 列@param row 行

*/

private void measureClickCell(int col, int row) {

if (col >= TOTAL_COL || row >= TOTAL_ROW)

return;

if (rows[row] != null) {

mClickCell = new Cell(rows[row].cells[col].num, rows[row].cells[col].state, rows[row].cells[col].i,

rows[row].cells[col].j);

rows[row].cells[col].state = State.CLICK_NUM;

if ("-5".equals(rows[row].cells[col].num)) {

mCallBack.deleteNum();

} else {

mCallBack.clickNum(rows[row].cells[col].num);

}

invalidate();

}

}

/**

组 以一行为一组

*/

private class Row {

public int j;

Row(int j) {

this.j = j;

}

// 一行3个单元格

public Cell[] cells = new Cell[TOTAL_COL];

public void drawCells(Canvas canvas) {

for (int i = 0; i < cells.length; i++) {

if (cells[i] != null)

cells[i].drawSelf(canvas);

}

}

}

// 单元格

private class Cell {

public String num;

public State state;

/**

i = 行 j = 列

*/

public int i;

nt i = 0; i < cells.length; i++) {

if (cells[i] != null)

cells[i].drawSelf(canvas);

}

}

}

// 单元格

private class Cell {

public String num;

public State state;

/**

i = 行 j = 列

*/

public int i;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。