其他分享
首页 > 其他分享> > Android 自定义软键盘实现 数字九宫格,准备Android面试

Android 自定义软键盘实现 数字九宫格,准备Android面试

作者:互联网

 /**
 * 列
 */
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;
    public int j;

    public Cell(String num, State state, int i, int j) {
        super();
        this.num = num;
        this.state = state;
        this.i = i;
        this.j = j;
    }

    // 绘制一个单元格 如果颜色需要自定义可以修改
    public void drawSelf(Canvas canvas) {
        switch (state) {
            case CLICK_NUM:
                // 绘制点击效果灰色背景
                canvas.drawRect((mCellWidth * j), (mCellHight * i),
                        (mCellWidth * (j + 1)), (mCellHight * (i + 1)), HuiseBgPaint);
                break;
        }
        if ("-5".equals(num)) {

最后

下面是辛苦给大家整理的学习路线

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

       if ("-5".equals(num)) {

最后

下面是辛苦给大家整理的学习路线

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

[外链图片转存中…(img-8eO0uqQm-1630821381715)]

标签:canvas,自定义,int,九宫格,private,mCellHight,Android,public,row
来源: https://blog.csdn.net/m0_61072537/article/details/120114200