序号 | 步骤名称 | 目的 |
|---|---|---|
1 | 判断当前机器是否支持Pencil Engine报点预测,以免功能失效。 | |
2 | 设置当前手写View上下文中LCD的刷新率。 | |
3 | 在onTouchEvent处理中,针对ACTION_MOVE和ACTION_UP消息,在合适时机调用相应接口获取预测点信息。 |
无
boolean isSupport = HwStrokeEstimate.isFeatureEnable(); Log.d(TAG, "isSupportEstimate:" + isSupport);
@Override
public void onVisibilityChanged(View changeView, int visibility) {
if (visibility == View.VISIBLE && mActivity != null && mActivity.getWindowManager() != null) {
Display display = mActivity.getWindowManager().getDefaultDisplay();
float refreshRate = display.getRefreshRate();
HwStrokeEstimate.setRefreshRate(refreshRate);
Log.d(TAG, "estimate, setRefreshRate:" + String.valueOf(refreshRate));
}
} @Override public boolean onTouchEvent(MotionEvent event) { float eventX = event.getX(); float eventY = event.getY(); float pressure = event.getPressure(); switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: onActionMove(event, eventX, eventY, pressure); break; case MotionEvent.ACTION_UP:mEventQueue.clear(); break; default:break; } return true; } private void onActionMove(MotionEvent event, float x, float y, float p) { float predictX = x; float predictY = y; long realTime = 0L; long predictTime = 0L; long ts0 = System.nanoTime(); long ts2 = 0L; long ts3 = 0L; int cnt = event.getHistorySize(); if (cnt > 0) { mLstEvents.clear(); for (int i = 0; i < cnt; i++) { /** 将真实的报点添加到队列中*/ HwMotionEventInfo hwEvent = new HwMotionEventInfo(event.getHistoricalX(i), event.getHistoricalY(i), event.getHistoricalPressure(i), event.getHistoricalAxisValue(MotionEvent.AXIS_TILT, i), event.getHistoricalEventTime(i)); mLstEvents.add(hwEvent); realTime = event.getHistoricalEventTime(i); } mEventQueue.fill(mLstEvents); mLstEvents.clear(); ts2 = System.nanoTime(); /** 使用预测算法进行预测,将预测的点加入到队列中*/ int ret = HwStrokeEstimate.getEstimateEvent(mEventQueue.getQueue(), mLstEvents); ts3 = System.nanoTime(); if ((ret == 0) && (mLstEvents.size() > 0)) { /** 取出预测点中的最后一个点的坐标及其时间戳*/ HwMotionEventInfo lastPredictEvent = mLstEvents.get(mLstEvents.size() - 1); predictX = lastPredictEvent.getX(); predictY = lastPredictEvent.getY(); predictTime = lastPredictEvent.getEventTime(); Log.i(TAG, "predictX: " + predictX + ", predictY: " + predictY + ", predictTime: " + predictTime); } } long ts1 = System.nanoTime(); /** 计算每一次的预测时间*/ long predictPeriod = predictTime > 0 ? predictTime - realTime : 0L; Log.d(TAG, "total cost: " + (ts1 - ts0) + ", estimate cost:" + (ts3 - ts2) + ", predict count:" + mLstEvents.size() + ", predict period:" + predictPeriod + ", dx:" + (predictX - x) + ", dy:"
在实现的报点预测应用中,在日志中查看到有预测后的报点打印出来,可以绘制出该预测点从而提升跟手性。