文档管理中心

报点预测功能

开发流程

展开

序号

步骤名称

目的

1

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

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

2

设置刷新率

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

3

获取预测报点信息

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

约束与限制

无

开发步骤

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

    boolean isSupport = HwStrokeEstimate.isFeatureEnable();
    Log.d(TAG, "isSupportEstimate:" + isSupport);

  2. 设置刷新率。

    在onVisibilityChanged方法中设置当前手写View上下文中LCD的刷新率:在不同机型或者同一机型的不同应用中,应用刷新率可能不一样,设置精确的刷新率有助于提高预测的准确性。
    @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)); 
         } 
     }

  3. 获取预测报点信息。

    在onTouchEvent处理中,针对ACTION_MOVE和ACTION_UP消息,在合适时机调用相应接口获取预测点信息:
    @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:" 

调测验证

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

搜索
请输入您想要搜索的关键词