搜索
开发文档
应用开发
快应用开发
小游戏开发
开发文档/应用开发/服务能力/小米手写笔引擎/客户端接入指南
客户端接入指南更新时间: 2024-10-30 17:06:00

一、使用说明

  • 笔迹预测:根据实际输入点,输出预测点,用于绘制预测轨迹
  • 一笔成形:记录一段笔迹的所有输入点,停顿一段时间后输出对应标准图形的绘制路径
  • 文字识别:记录多段笔迹的所有输入点,以字符串的形式输出对应的识别结果

二、使用约束

  • 笔迹预测:N/A
  • 一笔成形:仅支持Xiaomi HyperOS 2及以上的系统版本
  • 文字识别:仅支持Xiaomi HyperOS 2及以上的系统版本

三、开发步骤

1、笔迹预测

1.1 查询当前运行环境是否支持报点预测

获取当前机型是否具备支持报点预测的能力:

boolean isEnable = MiuiStrokeEstimate.isFeatureEnable(context);
if (!isEnable) {
Log.d(TAG, "Not support device.")
}

1.2 设置刷新率

在onVisibilityChanged方法中设置当前画板View上下文中屏幕的刷新率:

float refreshRate = context.getDisplay().getRefreshRate();
MiuiStrokeEstimate.setRefreshRate(refreshRate);
Log.d(TAG, "estimate, setRefreshRate:" + String.valueOf(refreshRate));

1.3 获取预测报点信息

在onTouchEvent中,针对Down和Move事件进行处理,以获取预测输出点:

private List<MiuiMotionEventInfo> freshPointList = new ArrayList<>();
private List<MiuiMotionEventInfo> predictPointList = new ArrayList<>();

@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
/* 获取预测输入点 */
MiuiMotionEventInfo predictInputPoint = MiuiMotionEventInfo.createByMotionEvent(event);
switch (action) {
case MotionEvent.ACTION_DOWN:
freshPointList.add(predictInputPoint);
break;
case MotionEvent.ACTION_MOVE:
int size = event.getHistorySize();
/* 获取历史点信息 */
for (int i = 0; i < size; i++) {
MiuiMotionEventInfo historyPoint = MiuiMotionEventInfo.createByMotionEvent(event, i);
/* 将历史点添加至freshPointList */
freshPointList.add(historyPoint);
}
/* 将当前点添加至freshPointList */
freshPointList.add(predictInputPoint);
/* 预测前先清除预测输出点 */
predictPointList.clear();
/* 获取预测点信息 */
int result = MiuiStrokeEstimate.getEstimateEvent(freshPointList, predictPointList);
/* 0成功,输出其它值代表出现异常 */
if (result == 0) {
/* 此处可进行下一步处理,如获取预测点绘制路径 */
/**
* getPredictPath(freshPointList.get(freshPointList.size() - 1), predictPointList)
*/
}
/* 清除预测输入点 */
freshPointList.clear();
break;
case MotionEvent.ACTION_UP:
break;
}

return true;
}

1.4 通过预测点获取预测轨迹的Path(可选)

private static Path getPredictPath(MiuiMotionEventInfo lastPoint, List<MiuiMotionEventInfo> predictPointList){
if (predictPointList != null && !predictPointList.isEmpty()) {
Path path = new Path();
path.moveTo(lastPoint.getX(), lastPoint.getY());
for (MiuiMotionEventInfo p : predictPointList) {
path.lineTo(p.getX(), p.getY());
}
return path;
}
return null;
}

2、一笔成形

2.1 查询当前运行环境是否支持一笔成形

获取当前机型是否具备支持一笔成形的能力:

boolean isEnable = MiuiOneStroke.isFeatureEnable(context);
if (!isEnable) {
Log.d(TAG, "Not support device.");
}

2.2(可选)设置触发一笔成形功能图形识别的停顿时间(单位:ms)

设置触发能力的停顿时间,可以在初始化阶段设置。若不设置则默认为800ms;若设置的值小于0或大于5000,则使用默认值。

MiuiOneStroke.setStopTime(stopTime);
Log.d(TAG, "Set stop time: " + stopTime);

2.3 传入触摸事件

在onTouchEvent中,获取和处理一笔成形输入点。

@Override
public boolean onTouchEvent(MotionEvent event) {
MiuiOneStroke.processTouchEvent(event);
/* 进行其它处理 */
}

2.4 获取Path形式的一笔成形输出结果

触发一笔成形能力,且一笔成形识别成功后,可以通过getPath方法获取到一笔成形的输出结果。如果触发一笔成形能力后,输入点没有匹配上任何SDK所支持的图形,或者有抬笔动作,一笔成形输出结果会被清除,即此时getPath方法会返回空的Path(path.isEmpty() == true)。可以自行选择在ACTION_MOVE的事件处理中直接获取,或者在onDraw的时候获取。

private Path shapePath = new Path();
private Path origninalPath = new Path();

@Override
public void onDraw(Canvas canvas) {
/* 绘制原始笔迹 */
canvas.drawPath(origninalPath, origninalPaint);
/* 获取一笔成形识别结果 */
shapePath = MiuiOneStroke.getPath();
if (shapePath != null) {
/* 绘制规整图形 */
canvas.drawPath(shapePath, shapePaint);
}
}

...

@Override
public boolean onTouchEvent(MotionEvent event) {
/* 传入触摸事件 */
MiuiOneStroke.processTouchEvent(event);
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
/* 可在此处获取一笔成形识别结果 */
/**
* shapePath = MiuiOneStroke.getPath();
*/
break;
case MotionEvent.ACTION_UP:
/* 可在此处用一笔成形识别结果替换原始笔迹 */
/**
* replaceOrigninalPath(shapePath);
*/
break;
}

return true;
}

...

private void replaceOrigninalPath(Path path) {
if (path == null) {
return;
}

if (path.isEmpty()) {
return;
}

/* 做替换原始笔迹的操作 */
}

2.5 销毁一笔成形能力

在不再需要该能力时,可以调用destroyShapeRecognize方法销毁相关能力:

MiuiOneStroke.destroyShapeRecognize();

3、文字识别

3.1 查询当前运行环境是否支持文字识别

获取当前机型是否具备支持文字识别能力:

isEnable = MiuiRecognize.isFeatureEnable(context);
if (!isEnable) {
Log.d(TAG, "Not support device.");
}

3.2 收集文字识别输入点

在onTouchEvent中,记录画板上所有笔画的点信息,用于做文字识别输入数据:

/* 数据类MiuiInk.Builder,用于记录当前所有笔画 */
private MiuiInk.Builder mInkBuilder;
/* 数据类MiuiInk.Stroke.Builder,用于记录当前这一笔的所有点信息 */
private MiuiInk.Stroke.Builder mStrokeBuilder;

@Override
public boolean onTouchEvent(MotionEvent event) {
if (mInkBuilder == null) {
/* 获取MiuiInk.Builder的实例 */
mInkBuilder = MiuiInk.builder();
}
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
/* 在下笔时获取MiuiInk.Stroke.builder实例 */
mStrokeBuilder = MiuiInk.Stroke.builder();
/* 保存手写笔下笔时点信息 */
mStrokeBuilder.addPoint(event);
break;
case MotionEvent.ACTION_MOVE:
if (mStrokeBuilder == null) {
mStrokeBuilder = MiuiInk.Stroke.builder();
}
/* 保存手写笔移动时的所有点信息 */
mStrokeBuilder.addPoint(event);
break;
case MotionEvent.ACTION_UP:
if (mStrokeBuilder == null) {
mStrokeBuilder = MiuiInk.Stroke.builder();
}
/* 保存手写笔抬笔时的点信息 */
mStrokeBuilder.addPoint(event);
/* 在抬笔时将当前这一笔的所有点信息保存到mInkBuilder */
mInkBuilder.addStroke(mStrokeBuilder.build());
break;
case MotionEvent.ACTION_CANCEL:
/* APP收到cancel事件,清空当前这笔的点信息 */
mStrokeBuilder = null;
}

return true;
}

3.3 触发文字识别能力

在需要触发文字识别能力时,将当前保存的所有笔画数据传入算法,需要注意的是如果当前机型不支持文字识别,则recognizeText方法可能会返回空:

public String doRecognize() {
if (mInkBuilder == null) {
return null;
}
/* 获取当前保存的所有笔画数据 */
MiuiInk ink = mInkBuilder.build();
/* 确认笔画数量不为零 */
if (ink.getStrokesCount() == 0) {
return null;
}
/* 执行文字识别,会将文字识别结果以字符串的形式返回 */
String recognizeResult = MiuiRecognize.recognizeText(ink);
/* 可以选择将文字识别结果打印出来 */
if (recognizeResult != null) {
Log.i(TAG, "Recognize result: " + String);
} else {
Log.w(TAG, "Text recognition failed");
}
/* 可以在这里清空已输入文字识别的笔画数据,为下一次文字识别做准备 */
mInkBuilder = null;
mStrokeBuilder = null;

return recognizeResult;
}

3.4 销毁文字识别能力

在不再需要该能力时,可以调用destroyTextRecognize方法销毁相关能力,在销毁后如果想重启该能力,则需要再次调用isFeatureEnable方法来初始化:

MiuiRecognize.destroyTextRecognize();

五、调测验证

1、笔迹预测

在实现的报点预测应用中,可以绘制出该预测点从而提升跟手性。

2、一笔成形

在实现的一笔成形能力的应用中,绘制一笔结束时,手写笔不离开屏幕并保持不动停顿一定时间(具体时间由自行设置,默认为800ms)后,可以获取到图形识别结果,并按需绘制出来。

3、文字识别

在实现文字识别能力的应用中,可以在触发一笔成形能力后将识别结果打印出来,或者通过Toast.makeText方法,以消息提示的形式将识别结果显示出来。

六、接口说明/API参考文档/调用方式说明

1、API接口文档

1.1 接口概述

  • 能力类
类名说明
MiuiStrokeEstimate笔迹预测能力类
MiuiRecognize文字识别能力类
MiuiOneStroke一笔成形能力类
  • 数据类
类名说明
MiuiMotionEventInfo笔迹预测数据类,用于构造笔迹预测输入数据
MiuiInk文字识别数据类,用于构造文字识别输入数据

上一篇:
下一篇: