ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-05 14:07:05  阅读:193  来源: 互联网

标签:canvas 自定义 int 九宫格 private mCellHight Android public row


 /**
 * 列
 */
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有