Android 自定义软键盘实现 数字九宫格,2021年Android常见面试题目
实现效果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常见面试题目相关推荐
- Android 自定义软键盘实现 数字九宫格
前言 最近项目在对接美团外卖功能 实现外面小哥凭取货码取货 对接完功能后 用户反馈 弹出的软键盘 很难输入 数字太小了 大概是下面这种显示方式 需求 组长说 要不搞一个自定义软键盘吧 数字搞大点 方便 ...
- android自定义系统键盘,Android自定义软键盘
[实例简介] Android自定义软键盘 [实例截图] [核心代码] keydemo └── keydemo ├── AndroidManifest.xml ├── bin │ ├── class ...
- Android自定义软键盘输入法,隐藏系统输入法显示光标的实现
android实现自定义软键盘,先上图看效果,效果基本上是仿ios输入法实现的 这里是实现隐藏系统输入法,同时让EditText能获取光标的代码部分(通过反射调用): <span style=& ...
- Android自定义软键盘样式:字母、数字、标点三种切换
先看效果图: 1.在需要的调用软键盘的activity_mian.xml中加入键盘控件 <!--自定义键盘控件--> <RelativeLayoutandroid:layout_wi ...
- android自定义键盘开源,Android自定义软键盘的设计与实现代码
偶然间发现了Android.inputmethodservice.Keyboard类,即android可以自定义键盘类,做了一个简单例子供大家参考. 效果如下: 先看界面布局文件 android:la ...
- android自动软键盘,Android自定义软键盘
MyKeyboard Android自定义键盘的使用 实现步骤 第一步: 1.新建一个xml文件夹放在res目录下面,然后新建xml文件:money_keyboard.xml 2.然后在XML文件中添 ...
- Android 自定义软键盘实现
module链接:https://download.csdn.net/download/meixi_android/10652565 compile project(':edlibrary') , ' ...
- android 自定义软键盘
哦然间发现了android.inputmethodservice.Keyboard类,即android可以自定义键盘类,做了一个简单例子供大家参考, 首先看看效果图: 键盘内容布局:keyconten ...
- Android自定义软键盘的实现
先看界面布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...
最新文章
- 入门架构——单机高性能
- MyBatis中提示:invalid comparison: java.util.LinkedHashMap and java.lang.String
- ElasticSearch探索之路(一)初识ElasticSearch:特点、应用场景、架构设计、基本概念
- 【趣味分享】C#实现回味童年的24点算法游戏
- 【强化学习】可视化学习tensorboard
- Linux 字符设备驱动开发基础(三)—— read()、write() 相关函数解析
- python与sap_Python结合SAP GUI Script操作sap的简易教程
- 西欧八国调查:25%受访者宁要AI政府也不要民选政治家
- python写入文件代码_从文件读取并写入StringIO – Python
- VMware下Ubuntu图形界面切换到命令行终端模式
- 前景检测算法(十一)--基于LBP纹理
- 使用npm发布自己的npm组件包
- Java计算机毕业设计单车商城源码+系统+数据库+lw文档
- python主函数的作用_Python中的main函数解析
- 【问题】myeclipse启动时Tocmat错误:cound not create the view :An unexpencted expetion was thrown
- matlab设计译码器,基于Matlab编译码器的仿真与设计
- 2016年5月热门IT职位的推荐
- 机械硬盘显示数据错误循环冗余检查文件如何寻回
- 万科副总裁毛大庆在建策沙龙上关于楼市走向的发言
- J2EE体系架构设计
热门文章
- HTML+CSS系列教程笔记 (2)
- 全线“封杀”神马,百度移动端显恐慌
- 工作总结8:从安卓调整到服务端后的思考
- Learning Attentive Pairwise Interaction for Fine-Grained Classification论文解读
- TIMO后台管理系统-基于SpringBoot开发
- 开关电源控制环路设计
- 字节跳动Android金三银四解析:Android架构组件Room功能详解,深度好文
- 手把手教你开发一款1024程序员节日历提醒服务
- 开发新体验——程序员
- AI赛车手登上Nature封面,人工智能选手如何狂虐人类顶级玩家?