上次简单说了一下 字体识别的分析 这篇 咱们就来一点一点探求一下这个的实现吧
这个字体识别软件 会用到 SQLite 以及 简单的 Android绘图
首先我们需要建立一个模板 就是汉字笔画的模板 这个模板就需要用到SQLite了
关键代码如下
@Override
public boolean onTouchEvent(MotionEvent event) {
// Log.e("Draw", "onTouchEvent");
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
chardata = new ArrayList<CharData>();
Log.v("Draw", "startx=" + x + " y=" + y);
path.moveTo(x, y);
currentPreX = x;
currentPreY = y;
lastPreX = x;
lastPreY = y;
currentX = (int) (x / (Width / GridNum)) + 1;
currentY = (int) (y / (Width / GridNum)) + 1;
String grid = "(" + currentX + "," + currentY + ")";
System.out.println(grid);
gridList.add(grid);
addData(x, y);
System.out.println("起点坐标" + x + "," + y);
break;
case MotionEvent.ACTION_MOVE:
Log.v("Draw", "x=" + x + " y=" + y);
path.quadTo(currentPreX, currentPreY, x, y);
lastX = (int) (lastPreX / (Width / GridNum)) + 1;
lastY = (int) (lastPreY / (Width / GridNum)) + 1;
currentX = (int) (x / (Width / GridNum)) + 1;
currentY = (int) (y / (Width / GridNum)) + 1;
String grids = "(" + currentX + "," + currentY + ")";
// 如果换格子了 就进入
if (listDataQuery(grids)) {
gridList.add(grids);
charCUP(x, y);
}
currentPreX = x;
currentPreY = y;
break;
case MotionEvent.ACTION_UP:
Log.v("Draw", "endx=" + x + " y=" + y);
System.out.println("终点坐标" + x + "," + y);
addData(x, y);
Datas.add(chardata);
/**
* 计算度数 计算笔顺 去除杂点 计算大小
*/
// JSAngle();
cacheCanvas.drawPath(path, paints);
path.reset();
// chardata.clear();
// initCanvas();
for (int i = 0; i < Datas.size(); i++) {
System.out.println("第" + i + "笔" + Datas.get(i).size());
}
break;
}
invalidate();
return true;
}
/**
* 计算笔顺
*/
void JSStrokeNum() {
int num = 0;
chardata.get(0).setIndex(0);
float oneAngle, twoAngle;
for (int i = 1; i < chardata.size(); i++) {
oneAngle = chardata.get(i).getAngle();
if (i + 1 < chardata.size()) {
twoAngle = chardata.get(i + 1).getAngle();
if (Math.abs(oneAngle - twoAngle) > 180) {
num = StrokeNumJiSuan(i, num, oneAngle, twoAngle, 0);
} else {
num = StrokeNumJiSuan(i, num, oneAngle, twoAngle, 1);
}
}
}
}
/**
* 计算笔顺方法
*
* @param i
* @param num
* @param oneAngle
* @param twoAngle
* @param type
*/
int StrokeNumJiSuan(int i, int num, float oneAngle, float twoAngle, int type) {
float angles = 0;
if (type == 0) {
angles = 180 - (360 - Math.abs(oneAngle - twoAngle));
} else {
angles = Math.abs(oneAngle - twoAngle);
}
if (angles > 36) {
num++;
chardata.get(i + 1).setIndex(num);
} else {
if (i + 2 < chardata.size()) {
twoAngle = chardata.get(i + 2).getAngle();
if (Math.abs(oneAngle - twoAngle) > 180) {
float angless = 180 - (360 - Math.abs(oneAngle - twoAngle));
if (angless > 36) {
System.out.println(oneAngle + "****" + twoAngle);
num++;
chardata.get(i + 1).setIndex(num);
} else {
chardata.get(i + 1).setIndex(num);
}
} else {
if (Math.abs(oneAngle - twoAngle) > 36) {
System.out.println(oneAngle + "****" + twoAngle);
num++;
chardata.get(i + 1).setIndex(num);
} else {
chardata.get(i + 1).setIndex(num);
}
}
} else {
chardata.get(i + 1).setIndex(num);
}
}
return num;
}
/**
* 顺序写入点
*
* @param x
* @param y
*/
void addData(float x, float y) {
CharData data = new CharData();
data.setPointX(x);
data.setPointY(y);
data.setAngle(0);
data.setIndex(0);
chardata.add(data);
}
/**
* 根据位置写入点
*
* @param x
* @param y
*/
void addData(int wz, float x, float y) {
CharData data = new CharData();
data.setPointX(x);
data.setPointY(y);
data.setAngle(0);
data.setIndex(0);
chardata.add(wz, data);
}
以上就是笔画模板的核心代码 给大家说明一下
首先 我们要获取用户输入的点坐标 通过记录用户手指走过的路径 来得到用户输入的这一笔的坐标我们存到一个集合里面
然后我们需要对这个集合里面的坐标进行 去除没有用的坐标点 然后增加标记点 记录用户在一笔里面是否有一些拐弯啦什么 最后通过算法优化等 来得到一个笔画的模板然后把它存到我们相应的模板库中 有什么不明白的地方欢迎大家在评论里面提问