实现效果GIF

实现代码

自定义View 一个NineNumericKeyboardView

/**

  • Author by Lyu
  • Date on 2021/5/26-19:55
  • Description:九宫格数字软键盘
    /
    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;

Android 自定义软键盘实现 数字九宫格,2021年Android常见面试题目相关推荐

  1. Android 自定义软键盘实现 数字九宫格

    前言 最近项目在对接美团外卖功能 实现外面小哥凭取货码取货 对接完功能后 用户反馈 弹出的软键盘 很难输入 数字太小了 大概是下面这种显示方式 需求 组长说 要不搞一个自定义软键盘吧 数字搞大点 方便 ...

  2. android自定义系统键盘,Android自定义软键盘

    [实例简介] Android自定义软键盘 [实例截图] [核心代码] keydemo └── keydemo ├── AndroidManifest.xml ├── bin │   ├── class ...

  3. Android自定义软键盘输入法,隐藏系统输入法显示光标的实现

    android实现自定义软键盘,先上图看效果,效果基本上是仿ios输入法实现的 这里是实现隐藏系统输入法,同时让EditText能获取光标的代码部分(通过反射调用): <span style=& ...

  4. Android自定义软键盘样式:字母、数字、标点三种切换

    先看效果图: 1.在需要的调用软键盘的activity_mian.xml中加入键盘控件 <!--自定义键盘控件--> <RelativeLayoutandroid:layout_wi ...

  5. android自定义键盘开源,Android自定义软键盘的设计与实现代码

    偶然间发现了Android.inputmethodservice.Keyboard类,即android可以自定义键盘类,做了一个简单例子供大家参考. 效果如下: 先看界面布局文件 android:la ...

  6. android自动软键盘,Android自定义软键盘

    MyKeyboard Android自定义键盘的使用 实现步骤 第一步: 1.新建一个xml文件夹放在res目录下面,然后新建xml文件:money_keyboard.xml 2.然后在XML文件中添 ...

  7. Android 自定义软键盘实现

    module链接:https://download.csdn.net/download/meixi_android/10652565 compile project(':edlibrary') , ' ...

  8. android 自定义软键盘

    哦然间发现了android.inputmethodservice.Keyboard类,即android可以自定义键盘类,做了一个简单例子供大家参考, 首先看看效果图: 键盘内容布局:keyconten ...

  9. Android自定义软键盘的实现

    先看界面布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...

最新文章

  1. 入门架构——单机高性能
  2. MyBatis中提示:invalid comparison: java.util.LinkedHashMap and java.lang.String
  3. ElasticSearch探索之路(一)初识ElasticSearch:特点、应用场景、架构设计、基本概念
  4. 【趣味分享】C#实现回味童年的24点算法游戏
  5. 【强化学习】可视化学习tensorboard
  6. Linux 字符设备驱动开发基础(三)—— read()、write() 相关函数解析
  7. python与sap_Python结合SAP GUI Script操作sap的简易教程
  8. 西欧八国调查:25%受访者宁要AI政府也不要民选政治家
  9. python写入文件代码_从文件读取并写入StringIO – Python
  10. VMware下Ubuntu图形界面切换到命令行终端模式
  11. 前景检测算法(十一)--基于LBP纹理
  12. 使用npm发布自己的npm组件包
  13. Java计算机毕业设计单车商城源码+系统+数据库+lw文档
  14. python主函数的作用_Python中的main函数解析
  15. 【问题】myeclipse启动时Tocmat错误:cound not create the view :An unexpencted expetion was thrown
  16. matlab设计译码器,基于Matlab编译码器的仿真与设计
  17. 2016年5月热门IT职位的推荐
  18. 机械硬盘显示数据错误循环冗余检查文件如何寻回
  19. 万科副总裁毛大庆在建策沙龙上关于楼市走向的发言
  20. J2EE体系架构设计

热门文章

  1. HTML+CSS系列教程笔记 (2)
  2. 全线“封杀”神马,百度移动端显恐慌
  3. 工作总结8:从安卓调整到服务端后的思考
  4. Learning Attentive Pairwise Interaction for Fine-Grained Classification论文解读
  5. TIMO后台管理系统-基于SpringBoot开发
  6. 开关电源控制环路设计
  7. 字节跳动Android金三银四解析:Android架构组件Room功能详解,深度好文
  8. 手把手教你开发一款1024程序员节日历提醒服务
  9. 开发新体验——程序员
  10. AI赛车手登上Nature封面,人工智能选手如何狂虐人类顶级玩家?