文档管理中心
我的
指南手写笔能力应用开发报点预测功能

报点预测功能

开发流程

展开

序号

步骤名称

目的

1

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

判断当前机器是否支持Pencil Engine报点预测,以免功能失效。

2

设置刷新率

设置当前手写View上下文中LCD的刷新率。

3

获取预测报点信息

在onTouchEvent处理中,针对ACTION_MOVE和ACTION_UP消息,在合适时机调用相应接口获取预测点信息。

约束与限制

无

开发步骤

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

    收起
    自动换行
    深色代码主题
    复制
    1. boolean isSupport = HwStrokeEstimate.isFeatureEnable();
    2. Log.d(TAG, "isSupportEstimate:" + isSupport);

  2. 设置刷新率。

    在onVisibilityChanged方法中设置当前手写View上下文中LCD的刷新率:在不同机型或者同一机型的不同应用中,应用刷新率可能不一样,设置精确的刷新率有助于提高预测的准确性。
    收起
    自动换行
    深色代码主题
    复制
    1. @Override
    2. public void onVisibilityChanged(View changeView, int visibility) {
    3. if (visibility == View.VISIBLE && mActivity != null && mActivity.getWindowManager() != null) {
    4. Display display = mActivity.getWindowManager().getDefaultDisplay();
    5. float refreshRate = display.getRefreshRate();
    6. HwStrokeEstimate.setRefreshRate(refreshRate);
    7. Log.d(TAG, "estimate, setRefreshRate:" + String.valueOf(refreshRate));
    8. }
    9. }

  3. 获取预测报点信息。

    在onTouchEvent处理中,针对ACTION_MOVE和ACTION_UP消息,在合适时机调用相应接口获取预测点信息:
    收起
    自动换行
    深色代码主题
    复制
    1. @Override
    2. public boolean onTouchEvent(MotionEvent event) {
    3. float eventX = event.getX();
    4. float eventY = event.getY();
    5. float pressure = event.getPressure();
    6. switch (event.getActionMasked()) {
    7. case MotionEvent.ACTION_DOWN:
    8. break;
    9. case MotionEvent.ACTION_MOVE:
    10. onActionMove(event, eventX, eventY, pressure);
    11. break;
    12. case MotionEvent.ACTION_UP:mEventQueue.clear();
    13. break;
    14. default:break;
    15. }
    16. return true;
    17. }
    18. private void onActionMove(MotionEvent event, float x, float y, float p) {
    19. float predictX = x;
    20. float predictY = y;
    21. long realTime = 0L;
    22. long predictTime = 0L;
    23. long ts0 = System.nanoTime();
    24. long ts2 = 0L;
    25. long ts3 = 0L;
    26. int cnt = event.getHistorySize();
    27. if (cnt > 0) {
    28. mLstEvents.clear();
    29. for (int i = 0; i < cnt; i++) {
    30. /** 将真实的报点添加到队列中*/
    31. HwMotionEventInfo hwEvent = new HwMotionEventInfo(event.getHistoricalX(i),
    32. event.getHistoricalY(i), event.getHistoricalPressure(i),
    33. event.getHistoricalAxisValue(MotionEvent.AXIS_TILT, i),
    34. event.getHistoricalEventTime(i));
    35. mLstEvents.add(hwEvent);
    36. realTime = event.getHistoricalEventTime(i);
    37. }
    38. mEventQueue.fill(mLstEvents);
    39. mLstEvents.clear();
    40. ts2 = System.nanoTime();
    41. /** 使用预测算法进行预测,将预测的点加入到队列中*/
    42. int ret = HwStrokeEstimate.getEstimateEvent(mEventQueue.getQueue(), mLstEvents);
    43. ts3 = System.nanoTime();
    44. if ((ret == 0) && (mLstEvents.size() > 0)) {
    45. /** 取出预测点中的最后一个点的坐标及其时间戳*/
    46. HwMotionEventInfo lastPredictEvent = mLstEvents.get(mLstEvents.size() - 1);
    47. predictX = lastPredictEvent.getX();
    48. predictY = lastPredictEvent.getY();
    49. predictTime = lastPredictEvent.getEventTime();
    50. Log.i(TAG, "predictX: " + predictX + ", predictY: " + predictY + ", predictTime: " + predictTime);
    51. }
    52. }
    53. long ts1 = System.nanoTime();
    54. /** 计算每一次的预测时间*/
    55. long predictPeriod = predictTime > 0 ? predictTime - realTime : 0L;
    56. Log.d(TAG, "total cost: " + (ts1 - ts0) + ", estimate cost:" + (ts3 - ts2) + ", predict count:" + mLstEvents.size() + ", predict period:" + predictPeriod + ", dx:" + (predictX - x) + ", dy:"

调测验证

在实现的报点预测应用中,在日志中查看到有预测后的报点打印出来,可以绘制出该预测点从而提升跟手性。